锟斤拷 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!
通锟斤拷锟斤拷锟脚分革拷锟斤拷锟斤拷 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 锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷 为某锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟� 注锟解,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 同锟斤拷锟斤拷锟斤拷锟皆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; }
}
?>
锟斤拷锟斤拷 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 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 之前锟斤拷锟斤拷锟斤拷锟角硷拷锟捷的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; // 锟斤拷锟斤拷锟斤拷锟斤拷
}
?>