从PHP5.4.0版本开始,PHP提供了一个新的代码重用概念,即Trait。Trait字面意思是“特征”和“特征”。我们可以理解为使用Trait关键字可以为PHP中的类添加新的特性。熟悉面向对象的都知道,软件开发中常用的代码复用方式有两种:继承和多态。在PHP中,只能实现单继承。特质避免了这一点。下面是一个简单的例子来进行比较。1.继承VS多态VSTrait现在有两个类:Publish.php和Answer.php。要在其中添加LOG功能,请记录类内的操作。有以下选项:继承多态性Trait1.1。继承如图:代码结构如下://Log.phpstartLog();$publish->endLog();//Answer.phpstartLog();$answer->endLog();可以看出,我们在不增加代码复杂度的情况下实现了代码复用。1.4.结语继承的方法虽然也能解决问题,但是其思想违背了面向对象的原则,非常粗暴;多态的方法也是可行的,但是不符合软件开发中的DRY原则,增加了维护成本。Trait方法避免了上述缺点,相对优雅地实现了代码重用。2.Trait的范围了解了Trait的好处之后,我们还需要了解其实现中的规则。让我们先谈谈范围。这个比较容易证明,实现代码如下:publicF();$this->protectF();$this->privateF();}}$publish=newPublish();$publish->doPublish();执行上面的代码,输出结果如下:publicfunctionprotectedfunctionprivatefunction可以发现Trait的作用域在Trait类内部是可见的。可以理解为use关键字将Trait的实现代码复制到引用Trait的类中。3.Trait中属性的优先级说到优先级,必须要有一个参照对象来进行比较。这里的引用对象是指Trait的类及其父类。使用以下代码证明Trait应用中属性的优先级:publicF();$this->protectF();}}$publish=newPublish();$publish->doPublish();上面代码的输出结果如下:Publish::publicFpublicfunctionLog::protectFprotectedfunction通过上面的例子可以得出Trait应用中的优先级是这样的:来自当前类的成员覆盖了trait的方法特征覆盖继承的方法。类成员优先级为:当前类>Trait>父类4.一个类中代替andAs关键字可以引用多个Traits,如下:<?phptraitLog{publicfunctionstartLog(){echo__METHOD__.“公共职能”。PHP_EOL;}受保护的函数endLog(){echo__METHOD__。'受保护的功能'。PHP_EOL;}}traitCheck{publicfunctionparameterCheck($parameters){//做某事}}classPublishextendsQuestion{useLog,Check;公共功能doPublish($para){$this->startLog();$this->parameterCheck($para);$this->endLog();}}通过上面的方法,我们可以在一个类中引用多个Trait当引用多个Traits时,很容易出错。最常见的问题是如果两个Traits中有同名的属性或方法怎么办?这时候就需要用到关键字Insteadof和as。.请看下面的实现代码:startLog();$this->parameterCheck('params');$this->csl();}}$publish=newPublish();$publish->doPublish();执行上面的代码,输出结果如下:Log::startLogpublicfunctionCheck::parameterCheckparametercheckparamsCheck::startLogpublicfunction就像字面意思一样。Insteadof关键字将后者替换为前者,而as关键字为被替换的方法提供别名。引用Trait时,使用use关键字。use关键字也用于引用名称空间。两者的区别在于,在引用Trait时,是在类内部使用。
