PHP之Trait
Trait
PHP是单继承语言,无法多继承,为了解决这个问题,在PHP5.4时出现了Trait,提供了一种代码复用机制。
用法: 通过在类中使用use 关键字,声明要组合的Trait名称,具体的Trait的声明使用Trait关键词,Trait不能实例化 。
例子:
<?php trait B { } class A { use B; }
Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够自由地在不同层次结构内独立的类中复用 method。
当不同类都用到一些相同功能时就会出问题。例如,几个类都需要生成单例,由于 PHP 不支持多继承,那么只能在每个类重复编写代码,或者说将单例功能写在父类中并让这几个类都继承这个父类,这种继承是无意义的。Trait 提供了这类问题的解决方案。
代码实现:
<?php
trait Singleton
{
private static $instance;
public static function getInstance() {
if (!(self::$instance instanceof self)) {
self::$instance = new self;
}
return self::$instance;
}
}
class Db
{
use Singleton;
}
class Log
{
use Singleton;
}
$db = Db::getInstance();
$log = Log::getInstance();
var_dump($db, $log);
打印结果如下:
class Db#1 (0) {
}
class Log#2 (0) {
}
由此实现了代码复用,多继承的效果。
Trait优先顺序
如果父类,当前类和Trait都有相同方法,优先级则是如下:
当前类>Trait>父类
多个Trait冲突解决
- insteadof指定使用哪一个trait方法
use A, B { B::a insteadof A;//a方法冲突时使用B类的a方法而不使用A类的a方法 A::b insteadof B; //b方法冲突时使用A类的b方法而不使用B类的b方法 }
- 通过as关键字指定别名
use A, B { B::a as c; //声明B类的a方法为c,作用于该类 A::b as d; //声明A类的b方法为d,作用于该类 }
本作品采用《CC 协议》,转载必须注明作者和本文链接