�� 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!
ͨ�����ŷָ����� use �����г���� trait�����Զ����뵽һ�����С�
Example #4 ��� trait ���÷�
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World';
}
}
class MyHelloWorld {
use Hello, World;
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 A {
public function smallTalk() {
echo 'a';
}
public function bigTalk() {
echo 'A';
}
}
trait B {
public function smallTalk() {
echo 'b';
}
public function bigTalk() {
echo 'B';
}
}
class Talker {
use A, B {
B::smallTalk insteadof A;
A::bigTalk insteadof B;
}
}
class Aliased_Talker {
use A, B {
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; }
}
?>
���� 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 Hello, World;
}
class MyHelloWorld {
use HelloWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
�������̻������
Hello World!
Ϊ�˶�ʹ�õ���ʩ��ǿ��Ҫ��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;
}
}
?>
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; // ��������
}
?>