PHP Traits

一、Traits简单介绍

在计算机编程中,Traits是面向对象编程中使用的一种概念,它表示一组可用于扩展类功能的方法。

二、Traits特点

Traits提供了一组实现行为的方法,并要求类实现一组参数化所提供行为的方法。
对于对象间的通信(以及对象之间的共享),特性在面向对象的协议(接口)和mixin之间有所不同。界面可以通过方法签名来定义一个或多个行为,而特征通过完整的方法定义来定义行为:即,它包括方法的主体。相比之下,mixin包含完整的方法定义,并且还可以通过成员变量携带状态,而特征通常不会。
因此,被定义为特征的对象被创建为方法的组合,其可以被其他类使用而不需要多重继承。在命名冲突的情况下,当一个类所使用的多个特征具有同名的方法时,程序员必须明确地消除这些方法中将使用哪一种方法;从而手动解决多重继承的钻石问题。这与面向对象编程中的其他构成方法不同,在这种方法中,冲突的名称可以通过范围规则自动解决。
尽管mixin只能使用继承操作构成,但特征提供了更广泛的操作选择,包括:
对称和:合并两个不相交特征以创建新特征的操作;
重写(或不对称总和):通过向现有特征添加方法形成新特征的操作,可能会覆盖其某些方法;
别名:通过为现有方法添加新名称来创建新特征的操作;
排除:通过从现有特征中移除方法形成新特征的操作。 (将它与别名操作组合会产生浅层重命名操作)。
特质的构成方式如下:
性状组成是可交换的;添加特征的顺序并不重要。例如,给定性状S = A + B,则性状T = B + A与S相同。
  冲突的方法被排除在组合物之外。
嵌套性状相当于扁平化特征;构图层次不影响特征行为。例如,给定性状S = A + X,其中X = B + C,则性状T = A + B + C与S相同
三、代码示例
允许模拟多重继承的方面:
trait TBounding{ 
   public $x, $y, $width, $height;
}
trait TMoveable{
    public function moveTo($x, $y)    {  
      // …    }}trait TResizeable{   
 public function resize($newWidth, $newHeight)    {  
      // …    }}class Rectangle{  
  use TBounding, TMoveable, TResizeable; 
   public function fillColor($color)    {  
      // …    }}
原文地址:https://www.cnblogs.com/sccwxl/p/9776528.html