php和java,c++一样都是单继承模式。但是像python,是支持多继承(即Mixin模式)。那么如何在php中实现多继承模式?这就需要使用trait。

trait Arrayabletrait{

public function toArray(){

}

}

class Model{

use Arrayabletrait;

}

$model = new Model();

$model->toArray();

Trait使用场景

有些功能不需要类的方法属性,但是在不同的类都有使用需求。例如上面的对象转数组方法。这种情况可以使用一个基类定义toArray方法,则需要将这类基础方法定义在尽可能顶层的基类当中,保证所有的类都能够调用这个方法。

类因为某些需求,已经继承了第三方类对象。例如第三方orm模型类。这种情况如果要给类附加一些公共的功能,除了创建一个继承于orm模型的基类,复制一套公共功能的代码之外,就可以使用trait。

trait使用注意

方法优先级

trait Arrayabletrait{

public function logname(){

return 'trait:'.$this->name;

}

public static function staticlog(){

return 'trait:'.self::$staticname;

}

}

class Obj{

protected $name = 'Obj';

public static $staticname = 'Obj';

public function logname(){

return 'obj:'.$this->name;

}

}

class Model extends Obj{

protected $name = 'model';

public static $staticname = 'model';

use Arrayabletrait;

public function logname(){

return 'model:'.$this->name;

}

public static function staticlog(){

return 'model:'.self::$staticname;

}

}

class Model2 extends Obj{

protected $name = 'model2';

public static $staticname = 'Model2';

use Arrayabletrait;

}

$model = new Model();

$model2 = new Model2();

echo $model->logname()."\n";

echo $model2->logname()."\n";

echo Model::staticlog()."\n";

echo Model2::staticlog()."\n";

上面输出内容分别为model:model,trait:model2,model:model,trait:model2.可以看出,trait方法优先级为 当前对象>trait>父类,以上规则同样使用于静态调用。

属性定义要特别小心!!trait中可以定义属性。但是不能和usetrait当前类定义的属性相同,否则会报错:define the same property。但是,如果父类使用了trait,子类定义trait中存在的属性,则没有问题。

trait Arrayabletrait{

public $logger='file';

public function log(){

return 'trait:'.$this->logger.$this->name;

}

}

class Obj{

use Arrayabletrait;

protected $name = 'Obj';

}

class Model extends Obj{

protected $logger = 'redis';

}

$model = new Model();

echo $model->log()."\n";

私有属性私有方法。triat中可以方位use类的私有属性私有方法!!

从以上可以看出,trait本身是对类的一个扩展,在trait中使用$this ,self,static,parent都与当前类一样,zend底层将trait代码嵌入到类当中,相当于底层帮我们实现了代码复制功能。

多个trait相同方法。

trait Arrayabletrait1{

public function log(){

return 'trait1:'.$this->logger.$this->name;

}

public function logname(){

return 'trait1:'.$this->name;

}

}

trait Arrayabletrait2{

public function log(){

return 'trait2:'.$this->logger.$this->name;

}

public function logname(){

return 'trait1:'.$this->name;

}

}

class Model{

public $name = 'model';

use Arrayabletrait1,Arrayabletrait2{

Arrayabletrait1::log insteadof Arrayabletrait2;

Arrayabletrait2::logname insteadof Arrayabletrait1;

Arrayabletrait2::logname as logname1;

}

protected $logger = 'redis';

}

$model = new Model();

echo $model->log()."\n";

echo $model->logname1()."\n";

多trait相同的方法,需要使用instanceof 指定使用哪个trait的方法。instanceof后面的使用的trait。可以使用as设置添加方法别名(添加,原有方法还是能调用!!)。as还可以改变方法的访问控制

Arrayabletrait2::logname as private改为私有方法。

以上所述是小编给大家介绍的PHP神奇又有用的Trait详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

php动态+trait,详解PHP神奇又有用的Trait相关推荐

  1. python动态类型的坑_python进阶教程之动态类型详解

    动态类型(dynamic typing)是Python另一个重要的核心概念.我们之前说过,Python的变量(variable)不需要声明,而在赋值时,变量可以重新赋值为任意值.这些都与动态类型的概念 ...

  2. Android 动态分区详解(六) 动态分区的底层机制

    文章目录 1. Android 动态分区的两重含义 2. device mapper 的原理 3. linear 映射的原理 3.1 多个设备映射示例 3.2 `dmsetup create` 命令参 ...

  3. Android 动态分区详解(七) overlayfs 与 adb remount 操作

    0. 导读 最开始学习 Android 动态分区源码的时候,比较代码发现 system/core/fs_mgr 目录下多了一个名为 fs_mgr_overlayfs.cpp 的文件,一直不知道什么时候 ...

  4. Android 动态分区详解(一) 5 张图让你搞懂动态分区原理

    文章目录 0. 导读 1. 动态分区详解的背景 1.1 背景 1.2 动态分区的本质 2. Linux device mapper 驱动 3. Android 动态分区布局 3.1 动态分区布局 3. ...

  5. C++静态库与动态库详解与使用

    福利 | 百度 AI 开发者大会免费门票领取    CSDN日报20170628--<实习,背后的选择?>    [直播]探究Linux的总线.设备.驱动模型! C++静态库与动态库详解与 ...

  6. JAVA动态代理详解

    JAVA动态代理详解 问题 1:什么是静态代理,动态代理? 2:动态代理的好处? 什么是静态代理 以生活中例子来看,我作为某某品牌面膜的北京区代理,我替厂家卖面膜,我属于代理,厂家属于委托方. 联系到 ...

  7. AutoCAD .Net二次开发之JIG动态绘制详解

    AutoCAD .Net二次开发之JIG动态绘制详解 AutoCAD平台动态绘制分两种,单实体绘制EntityJig和多实体绘制DrawJig,需要自己自定义类去继承.(本人的理解全放在了代码注释中, ...

  8. 【转】PHP之Trait详解 以及 trait 冲突的解决 insteadof

    PHP之Trait学习!! (转)PHP之Trait详解 (转)trait 冲突的解决 insteadof

  9. 是隐极电机_资料 | 发电机定子绕组端部动态特性试验详解

    一.试验目的 大型汽轮发电机运行过程中,定子端部受二倍工频(100Hz)的电磁激振力.如果定子端部的模态接近100Hz,将发生谐振,从而可能因振幅过大而发生结构松动.磨损.绝缘损坏等现象,甚至断裂等故 ...

最新文章

  1. Bootstrap4+MySQL前后端综合实训-Day10-AM【实训汇报-下午返校、项目代码(7个包+7个Html页面)】
  2. R中rep函数的使用
  3. 【回归损失函数】L1(MAE)、L2(MSE)、Smooth L1 Loss详解
  4. 第一次创业失败的总结 - 产品设计
  5. 关于M1芯片版Mac安装Photoshop后储存psd时出现程序错误提示的解决方法
  6. java出栈序列合法性_pat--7-11 出栈序列的合法性(25 分)
  7. svnadmin hotcopy整库拷贝方式(转载)
  8. Alphago再下一城,人机大战能告诉我们什么?
  9. 使用循环结构输出数字三角形图形
  10. cygwin下使用apt-cyg安装新软件
  11. 苹果手机直播怎么投屏 苹果手机投影电脑屏幕
  12. Macbook pro如何设置触控栏
  13. 学计算机电脑厚度23mm,轻薄机身兼具生产力!适合专业人士的轻薄笔记本电脑,了解下?...
  14. 公司员工公寓楼建设项目电力监控系统的研究与应用
  15. 卡波姆对皮肤的作用副作用_【 卡波姆的副作用】_影响_坏处-大众养生网
  16. 计算机技术创新型,【现场】艺术与科技跨学科创新型创作人才培养成果展
  17. 计算机毕业设计ssm金牛社区疫情防控系统73a5s系统+程序+源码+lw+远程部署
  18. oppo手机忘记解锁图案怎么办
  19. Python程序执行时间测试
  20. 2019年5月新出Dart Flutter入门实战视频教程网盘下载地址

热门文章

  1. Angular应用只执行指定单元测试的小技巧
  2. 脑部手术成功,只是万里长征走完了第一步
  3. kyma上service catalog的安装部署方法
  4. S4 extension field的异步创建和后台作业
  5. 检测Product 被其他business transaction 引用的小程序
  6. ABAP Create Decision Step in Workflow
  7. getFilterFromRunTimeService - what is the trigger point of data load
  8. SAML request和response的一对典型例子,供将来参考
  9. SAP CRM和SAP Hybris的action profile
  10. 线段树-简单线段树模板