温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php代码复用机制详细介绍

发布时间:2021-07-28 17:27:49 来源:亿速云 阅读:218 作者:chen 栏目:大数据

本篇内容介绍了“php代码复用机制详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

提到 php 的代码复用,我们可能第一时间会想到继承,但是这种单继承语言一旦派生的子类过多,那么会产生一系列的问题,比如依赖父类、耦合性太大、破坏了类的封装性。那么有没有更好的方法来实现代码复用呢?

自 PHP 5.4.0 起,PHP 实现了另外一种代码复用的一个方法,称为 traits。

Traits 是一种为类似 PHP 的单继承语言而准备的代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用方法集。Traits 和类组合的语义是定义了一种方式来减少复杂性,避免传统多继承和混入类(Mixin)相关的典型问题。

基础使用方法

Traits 的使用非常简单,只需要在类中使用 use 关键字即可。

trait A {     public function test() {         echo 'trait A::test()';     } } class b {     use A; } $b=new b(); $b->test();

优先级

简单来说 Trait 优先级大于父类方法,但是小于当前类方法。

trait A {     public function test() {         echo 'trait A::test()';     }     public function test1() {         echo 'trait A::test1()';     }     } class base{     public function test(){         echo 'base::test()';     }     public function test1(){         echo 'base::test1()';     }     } class b extends base{     use A;     public function test(){         echo 'b::test()';     } } $b=new b(); $b->test();//b::test() $b->test1();//trait A::test1()

Trait冲突问题

在使用多个 Trait 时,如果其中存在相同的方法名称,那么就会产生冲突。使用 insteadof 和 as 可以解决方法名称冲突问题

insteadof可以声明使用两个相同方法名称中的具体某个方法。

trait A {     public function test() {         echo 'trait A::test()';     }  } trait B {     public function test() {         echo 'trait B::test()';     }  } class c{     use A,B{         A::test insteadof B;//使用 insteadof 明确使用哪个方法         B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用     } } $c=new c(); $c->test();//trait A::test() $c->testB();//trait B::test()

方法访问控制

使用 as 关键字我们可以对 trait 方法的访问权限进行修改

trait A {     public function test() {         echo 'trait A::test()';     }      private function test1(){         echo 'trait A::test1()';     } } class b{     use A{         test as protected;         test1 as public test2;//更改权限时还可以修改名称     } } $b=new b(); $b->test();//Fatal error: Call to protected method b::test() $b->test2();//trait A::test1()

Trait嵌套使用

trait A {         public function test1() {             echo 'test1';         }     }           trait B {         public function test2() {             echo 'test2';         }     }           trait C {         use A,B;     }           class D {         use C;     }           $d = new D();     $d->test2();  //test2

变量、属性、方法定义

Trait可定义属性,但类中不能定义同样名称属性

trait A {        public $test1;     }           class B {         use A;         public $test;         public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B...     }

Trait支持抽象方法、支持静态方法、不可以直接定义静态变量,但静态变量可被trait方法引用。

trait A {         public function test1() {             static $a = 0;             $a++;             echo $a;         }               abstract public function test2(); //可定义抽象方法     }           class B {         use A;         public function test2() {               }     }           $b = new B();     $b->test1(); //1     $b->test1(); //2

对比javascript

这种 trait use 的使用方法大概和 javascript 中的 call 有点相似,都是把一个另外一个对象挂载到当前对象的执行环境当中。当然 javascript 是基于原型的语言。两者也没有可比性。仅仅是使用方法相差无几,有助于理解。

function a() {     this.name="a";     this.getName=function(){         console.log(this.name);     } } function b(){     this.name="b";     a.call(this); } var b = new b();      b.getName();//a

因为 javascript 中的变量环境是基于函数的,所以会输出a

“php代码复用机制详细介绍”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

php
AI