-
博文分类专栏
- Jquery基础教程
-
- 文章:(15)篇
- 阅读:46566
- shell命令
-
- 文章:(42)篇
- 阅读:154239
- Git教程
-
- 文章:(36)篇
- 阅读:234850
- leetCode刷题
-
- 文章:(76)篇
- 阅读:131794
-
php中trait的使用2018-03-07 20:59 阅读(5309) 评论(0)
一、简介
PHP官方的解释:Trait是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免传统多继承和 Mixin 类相关典型问题。Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。
通俗地来讲,就是将某些类的共用的方法分离出来,定义为Trait,在需要的类中,通过use来引入,即可使用Trait里的方法。
案例如下:
<?php trait Trace{ public function show($data, $isDie = false) { var_dump($data); $isDie && die(); } } class Student{ use Trace; public $name = 'dq'; private $age = 18; public function __construct($name) { $this->name = $name; } } $s = new Student("dequan"); $s->show($s->name);
执行结果:
trait给类的单继承带来了福音,提高了代码的复用性,在平时的项目中,自己其实用的不多。
二、注意事项
1、优先级问题
class中的方法 > trait中的方法 > 基类中的方法
案例如下:
trait Trace{ public function show() { echo $this->name, ' age:', $this->age, ' in Trace', PHP_EOL; } } class Person{ public function show() { echo $this->name, ' age:', $this->age, ' in Person', PHP_EOL; } } class Student extends Person{ use Trace; public $name = 'dq'; private $age = 18; public function __construct($name) { $this->name = $name; } public function show() { echo $this->name, ' age:', $this->age, ' in Student', PHP_EOL; } } $s = new Student("dequan"); $s->show();
输出如下:
若注释Student类中的方法,输出如下:
备注:针对属性,优先级就完全不一样了,Trait 定义了一个属性后,类就不能定义同样名称的属性,否则就会报错。
2.引入多个trait
通过逗号分隔,use可以引入多个trait,如果不同的 trait 都插入了一个同名的方法,则会产生一个致命错误。为了解决冲突,PHP提供了insteadof 操作符来明确指定使用冲突方法中的哪一个。
3.trait支持抽象方法
由于trait 支持抽象方法,一定引入了包含抽象方法的trait,必须实现抽象方法。