2012-07-18 14:07:12     分类: Php
摘要: Trait是PHP自5.4.0起实现的一种新代码特性,旨在突破单继承的限制,让开发者更好的复用方法。Trait最大的作用不是从继承获得某些方法,而是将某些通用方法分离出来避免重复实现

PHP新特性之Trait

Trait是PHP自5.4.0起实现的一种新代码特性,旨在突破单继承的限制,让开发者更好的复用方法。

关于trait

1.Trait是否可以被实例化 答:不可以

2.Trait是否可以使用extends其它class 答:不可以,但是trait中可以使用trait来达到扩展的目的

3.Trait中是否可以使用Trait 答: 可以

4.Trait可以使用implements接口约束吗 答: 不可以

5.Trait中可以定义构造函数及魔术方法吗 答:可以

6.clone操作会复制tait方法吗 答:复制

7.Trait方法继承是怎样的顺序 答:trait方法继承顺序介于parent class 方法和当前class方法之间

使用示例:

<?php
class a
{
   public function first()
   {
      echo '这是class a 的first方法!';
   }

   public function third()
   {
      echo '这是class a 的third方法!';
   }
}

trait b 
{
   public function first()
   {
      echo '这是trait b 的first方法!';
   }

   public function second()
   {
      echo '这是trait b 的second方法!'; 
   }
}

trait c
{
   public function __construct()
   {
      echo '调用trait c定义的构造函数';
   }

   public function second()
   {
      echo '这是trait c 的second方法!';
   }
}

trait d
{
   use e;

   public function third()
   {
       echo '这是trait d 的third方法!';
   }
}

trait e
{
    public function fourth()
    {
        echo '这是trait e 的fourth方法!';
    }
}

class f extends a
{
   use b, c, d {
     a::second as asecond;
   };

   public function third()
   {
      echo '这是class f 的third方法';
   }
}

$obj = new f();  // prints: 调用trait c定义的构造函数;

$obj->first();   // prints: 这是trait a 的first方法;

$obj->second();  // prints: 这是trait b的second方法;

$obj->asecond(); // prints: 这是trait a的second方法;

$obj->third();   // prints: 这是class f的third方法;

$obj->fourth();  // prints: 这是trait e的fourth方法;

Trait最大的作用不是从继承获得某些方法,而是将某些通用方法分离出来避免重复实现,所以在传参方式上,我认为使用参数表的方式更好一些。固不建议违背「单一职责」原则滥用trait的能力。

此外,还可以利用Trait覆盖parent class的方法实现, 这样在实现覆盖的同时又避免重复实现方法。例如在实现Resopository模式时,可以使用trait来覆盖父类查询方法,这样就可以在trait方法中实现缓存及数据处理等过程,再通过参数,就可以获得控制能力


文章标签: