//文章参考了《Modern PHP》Josh Lockhart
性状是在5.4版本推出的。
个人认为,性状是继承和接口的一种中间态,或者说可以模块化实现的接口。
应用情景如下:
假定我们想要构建两个类,Robot和Car,然后我们希望能同时为这两个类添加GPS功能。
第一种实现方法,先构建一个父类GPS,然后让Robot和Car分别继承GPS。这显然是可以实现的,但很明显在逻辑上不通,因为GPS不应当出现在两者的继承体系中。
第二种实现方法,构建一个GPS接口,然后在Robot和Car中分别实现对应的函数。逻辑上,这种方法优于第一种,但是他违背了DRY(Don't repeat Yourself)原则,我们在项目的两个类中,重复实现了同一功能。
这个时候,我们就要想到第三种方法:性状 Trait
我们先定义一个GPS的性状:
trait GPS{
//相应的变量和方法
}
然后在Robot和Car类中混入这个性状:
class Car{
use GPS;
//其他代码
}
class Robot{
use GPS;
//其他代码
}
这样,在实例化Robot和car之后,我们就可以使用GPS功能了。