Trait

�� PHP 5.4.0 ��PHP ʵ����һ�ִ��븴�õķ�������Ϊ trait��

Trait ��Ϊ���� PHP �ĵ��̳����Զ�׼����һ�ִ��븴�û��ơ�Trait Ϊ�˼��ٵ��̳����Ե����ƣ�ʹ������Ա�ܹ����ɵ��ڲ�ͬ��νṹ�ڶ��������и��� method��Trait �� Class ��ϵ����嶨����һ�ּ��ٸ����Եķ�ʽ�����⴫ͳ��̳к� Mixin ����ص������⡣

Trait �� Class ���ƣ�������ּ����ϸ���Ⱥ�һ�µķ�ʽ����Ϲ��ܡ� �޷�ͨ�� trait ������ʵ��������Ϊ��ͳ�̳�������ˮƽ���Ե���ϣ�Ҳ����˵��Ӧ�õļ��� Class ֮�䲻��Ҫ�̳С�

Example #1 Trait ʾ��

<?php
trait ezcReflectionReturnInfo {
    function 
getReturnType() { /*1*/ }
    function 
getReturnDescription() { /*2*/ }
}

class 
ezcReflectionMethod extends ReflectionMethod {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}

class 
ezcReflectionFunction extends ReflectionFunction {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}
?>

���ȼ�

�ӻ���̳еij�Ա�ᱻ trait ����ij�Ա�����ǡ�����˳�������Ե�ǰ��ij�Ա������ trait �ķ������� trait �򸲸��˱��̳еķ�����

Example #2 ����˳��ʾ��

�ӻ���̳еij�Ա������� SayWorld Trait �е� MyHelloWorld ���������ǡ�����Ϊ MyHelloWorld ���ж���ķ���һ�¡�����˳���ǵ�ǰ���еķ����Ḳ�� trait �������� trait �����ָ����˻����еķ�����

<?php
class Base {
    public function 
sayHello() {
        echo 
'Hello ';
    }
}

trait 
SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class 
MyHelloWorld extends Base {
    use 
SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
?>

�������̻������

Hello World!

Example #3 ��һ�����ȼ�˳�������

<?php
trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}

class 
TheWorldIsNotEnough {
    use 
HelloWorld;
    public function 
sayHello() {
        echo 
'Hello Universe!';
    }
}

$o = new TheWorldIsNotEnough();
$o->sayHello();
?>

�������̻������

Hello Universe!

��� trait

ͨ�����ŷָ����� use �����г���� trait�����Զ����뵽һ�����С�

Example #4 ��� trait ���÷�

<?php
trait Hello {
    public function 
sayHello() {
        echo 
'Hello ';
    }
}

trait 
World {
    public function 
sayWorld() {
        echo 
'World';
    }
}

class 
MyHelloWorld {
    use 
HelloWorld;
    public function 
sayExclamationMark() {
        echo 
'!';
    }
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>

�������̻������

Hello World!

��ͻ�Ľ��

������� trait ��������һ��ͬ���ķ��������û����ȷ�����ͻ�������һ����������

Ϊ�˽����� trait ��ͬһ�����е�������ͻ����Ҫʹ�� insteadof ����������ȷָ��ʹ�ó�ͻ�����е���һ����

���Ϸ�ʽ�������ų�������������as ���������� Ϊij��������������� ע�⣬as ����������Է���������������Ҳ����Ӱ���䷽����

Example #5 ��ͻ�Ľ��

�ڱ����� Talker ʹ���� trait A �� B������ A �� B �г�ͻ�ķ������䶨����ʹ�� trait B �е� smallTalk �Լ� trait A �е� bigTalk��

Aliased_Talker ʹ���� as �������������� talk ����Ϊ B �� bigTalk �ı�����

<?php
trait {
    public function 
smallTalk() {
        echo 
'a';
    }
    public function 
bigTalk() {
        echo 
'A';
    }
}

trait 
{
    public function 
smallTalk() {
        echo 
'b';
    }
    public function 
bigTalk() {
        echo 
'B';
    }
}

class 
Talker {
    use 
A{
        
B::smallTalk insteadof A;
        
A::bigTalk insteadof B;
    }
}

class 
Aliased_Talker {
    use 
A{
        
B::smallTalk insteadof A;
        
A::bigTalk insteadof B;
        
B::bigTalk as talk;
    }
}
?>

Note:

�� PHP 7.0 ֮ǰ�������ﶨ��� trait ͬ�������ԣ���������ȫ���ݵ�Ҳ���׳� E_STRICT����ȫ���ݵ���˼��������ͬ�ķ��ʿɼ��ԡ���ʼĬ��ֵ����

�޸ķ����ķ��ʿ���

ʹ�� as �﷨�������������������ķ��ʿ��ơ�

Example #6 �޸ķ����ķ��ʿ���

<?php
trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}

// �޸� sayHello �ķ��ʿ���
class MyClass1 {
    use 
HelloWorld sayHello as protected; }
}

// ������һ���ı��˷��ʿ��Ƶı���
// ԭ�� sayHello �ķ��ʿ�����û�з����仯
class MyClass2 {
    use 
HelloWorld sayHello as private myPrivateHello; }
}
?>

�� trait ����� trait

���� class �ܹ�ʹ�� trait һ�������� trait Ҳ�ܹ�ʹ�� trait���� trait ����ʱͨ��ʹ��һ������ trait���ܹ�������� trait �еIJ��ֻ�ȫ����Ա��

Example #7 �� trait ����� trait

<?php
trait Hello {
    public function 
sayHello() {
        echo 
'Hello ';
    }
}

trait 
World {
    public function 
sayWorld() {
        echo 
'World!';
    }
}

trait 
HelloWorld {
    use 
HelloWorld;
}

class 
MyHelloWorld {
    use 
HelloWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>

�������̻������

Hello World!

Trait �ij����Ա

Ϊ�˶�ʹ�õ���ʩ��ǿ��Ҫ��trait ֧�ֳ��󷽷���ʹ�á�

Example #8 ��ʾͨ�����󷽷�������ǿ��Ҫ��

<?php
trait Hello {
    public function 
sayHelloWorld() {
        echo 
'Hello'.$this->getWorld();
    }
    abstract public function 
getWorld();
}

class 
MyHelloWorld {
    private 
$world;
    use 
Hello;
    public function 
getWorld() {
        return 
$this->world;
    }
    public function 
setWorld($val) {
        
$this->world $val;
    }
}
?>

Trait �ľ�̬��Ա

Traits ���Ա���̬��Ա��̬�������塣

Example #9 ��̬����

<?php
trait Counter {
    public function 
inc() {
        static 
$c 0;
        
$c $c 1;
        echo 
"$c\n";
    }
}

class 
C1 {
    use 
Counter;
}

class 
C2 {
    use 
Counter;
}

$o = new C1(); $o->inc(); // echo 1
$p = new C2(); $p->inc(); // echo 1
?>

Example #10 ��̬����

<?php
trait StaticExample {
    public static function 
doSomething() {
        return 
'Doing something';
    }
}

class 
Example {
    use 
StaticExample;
}

Example::doSomething();
?>

����

Trait ͬ�����Զ������ԡ�

Example #11 ��������

<?php
trait PropertiesTrait {
    public 
$x 1;
}

class 
PropertiesExample {
    use 
PropertiesTrait;
}

$example = new PropertiesExample;
$example->x;
?>

Trait ������һ�����Ժ���Ͳ��ܶ���ͬ�����Ƶ����ԣ��������� fatal error�� ����������⣺�����Ǽ��ݵģ�ͬ���ķ��ʿɼ��ȡ���ʼĬ��ֵ���� �� PHP 7.0 ֮ǰ�������Ǽ��ݵģ������ E_STRICT �����ѡ�

Example #12 �����ͻ

<?php
trait PropertiesTrait {
    public 
$same true;
    public 
$different false;
}

class 
PropertiesExample {
    use 
PropertiesTrait;
    public 
$same true// PHP 7.0.0 ��û���⣬֮ǰ�汾�� E_STRICT ����
    
public $different true// ��������
}
?>