富贵资源网 Design By www.hznty.com
从PHP的5.4.0版本开始,PHP提供了一种全新的代码复用的概念,那就是Trait。Trait其字面意思是"特性"、"特点",我们可以理解为,使用Trait关键字,可以为PHP中的类添加新的特性。
熟悉面向对象的都知道,软件开发中常用的代码复用有继承和多态两种方式。在PHP中,只能实现单继承。而Trait则避免了这点。下面通过简单的额例子来进行对比说明。
1. 继承 VS 多态 VS Trait
现在有Publish.php
和Answer.php
这两个类。要在其中添加LOG功能,记录类内部的动作。有以下几种方案:
- 继承
- 多态
- Trait
1.1. 继承
如图:
代码结构如下:
// Log.php <"htmlcode">// Publish.php <"htmlcode">// Answer.php <"" src="/UploadFiles/2021-04-02/201701050846522.png">实现代码:
// Log.php <"htmlcode">// Publish.php <"htmlcode">// Answer.php <"" src="/UploadFiles/2021-04-02/201701050846523.png">实现代码如下:
// Log.php <"htmlcode">// Publish.php <"htmlcode">// Answer.php <"htmlcode"><"htmlcode">public function protected function private function可以发现,Trait的作用域在引用该Trait类的内部是都可见的。可以理解为use关键字将Trait的实现代码Copy了一份到引用该Trait的类中。
3. Trait中属性的优先级
说到优先级,就必须要有一个对比的参照物,这里的参照对象时引用Trait的类及其父类。
通过以下的代码来证明Trait应用中的属性的优先级:
<"htmlcode">Publish::publicF public function Log::protectF protected function通过上面的例子,可以总结出Trait应用中的优先级如下:
来自当前类的成员覆盖了 trait 的方法
trait 覆盖了被继承的方法
类成员优先级为:
当前类>Trait>父类
4. Insteadof和As关键字
在一个类中,可以引用多个Trait,如下:
<"htmlcode"><"htmlcode">Log::startLog public function Check::parameterCheck parameter checkparams Check::startLog public function就如字面意思一般,
insteadof
关键字用前者取代了后者,as
关键字给被取代的方法起了一个别名。在引用Trait时,使用了use关键字,use关键字也用来引用命名空间。两者的区别在于,引用Trait时是在class内部使用的。
富贵资源网 Design By www.hznty.com广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!富贵资源网 Design By www.hznty.com暂无评论...