Trait

锟斤拷 PHP 5.4.0 锟斤拷PHP 实锟斤拷锟斤拷一锟街达拷锟诫复锟矫的凤拷锟斤拷锟斤拷锟斤拷为 trait锟斤拷

Trait 锟斤拷为锟斤拷锟斤拷 PHP 锟侥碉拷锟教筹拷锟斤拷锟皆讹拷准锟斤拷锟斤拷一锟街达拷锟诫复锟矫伙拷锟狡★拷Trait 为锟剿硷拷锟劫碉拷锟教筹拷锟斤拷锟皆碉拷锟斤拷锟狡o拷使锟斤拷锟斤拷锟斤拷员锟杰癸拷锟斤拷锟缴碉拷锟节诧拷同锟斤拷谓峁癸拷诙锟斤拷锟斤拷锟斤拷锟斤拷懈锟斤拷锟� method锟斤拷Trait 锟斤拷 Class 锟斤拷系锟斤拷锟斤拷宥拷锟斤拷锟揭伙拷旨锟斤拷俑锟斤拷锟斤拷缘姆锟绞斤拷锟斤拷锟斤拷獯筹拷锟教承猴拷 Mixin 锟斤拷锟斤拷氐锟斤拷锟斤拷锟斤拷狻�

Trait 锟斤拷 Class 锟斤拷锟狡o拷锟斤拷锟斤拷锟斤拷旨锟斤拷锟斤拷细锟斤拷锟饺猴拷一锟铰的凤拷式锟斤拷锟斤拷瞎锟斤拷堋锟� 锟睫凤拷通锟斤拷 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;
    
/* ... */
}
?>

锟斤拷锟饺硷拷

锟接伙拷锟斤拷坛械某锟皆憋拷岜� trait 锟斤拷锟斤拷某锟皆憋拷锟斤拷锟斤拷恰锟斤拷锟斤拷锟剿筹拷锟斤拷锟斤拷锟斤拷缘锟角帮拷锟侥筹拷员锟斤拷锟斤拷锟斤拷 trait 锟侥凤拷锟斤拷锟斤拷锟斤拷 trait 锟津覆革拷锟剿憋拷锟教承的凤拷锟斤拷锟斤拷

Example #2 锟斤拷锟斤拷顺锟斤拷示锟斤拷

锟接伙拷锟斤拷坛械某锟皆憋拷锟斤拷锟斤拷锟斤拷 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 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 为某锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� 注锟解,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 同锟斤拷锟斤拷锟斤拷锟皆o拷锟斤拷锟斤拷锟斤拷锟斤拷全锟斤拷锟捷碉拷也锟斤拷锟阶筹拷 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 锟叫的诧拷锟街伙拷全锟斤拷锟斤拷员锟斤拷

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 锟侥筹拷锟斤拷锟皆�

为锟剿讹拷使锟矫碉拷锟斤拷施锟斤拷强锟斤拷要锟斤拷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 之前锟斤拷锟斤拷锟斤拷锟角硷拷锟捷的o拷锟斤拷锟斤拷锟� 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// 锟斤拷锟斤拷锟斤拷锟斤拷
}
?>