# PHP trait新特性
1. trait作用
> trait是一種為類似 PHP 的單繼承語言而準備的代碼復用機制。trait為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用方法集。trait和類組合的語義是定義了一種方式來減少復雜性,避免傳統多繼承和混入類(Mixin)相關的典型問題。
2. trait使用方法:
聲明:
~~~
<?php
//聲明一個trait 就是用trait 開頭,像聲明一個類一樣,只不過類是class,而trait 就是用trait聲明而已
trait Drive {
//像類一樣也有屬性
public $carName = "tarit";
//像類一樣,也有方法
public function driving() {
echo "driving {$this->carName}<br>";
}
}
~~~
使用:
~~~
<?php
class Student {
//注意這里與命名空間的區別
use Drive;
}
~~~
注意:當方法或屬性同名時,當前類中的方法會覆蓋 trait的 方法,而 trait 的方法又覆蓋了基類中的方法
## 多個tarit組合時,解決沖突問題
如:
~~~
<?php
trait Trait1 {
public function hello() {
echo "Trait1::hello\n";
}
public function hi() {
echo "Trait1::hi\n";
}
}
trait Trait2 {
public function hello() {
echo "Trait2::hello\n";
}
public function hi() {
echo "Trait2::hi\n";
}
}
class Class1 {
use Trait1, Trait2;
}
~~~
使用insteadof和as操作符來解決沖突,insteadof是使用某個方法替代另一個,而as是給方法取一個別名,具體用法請看代碼:
~~~
<?php
trait Trait1 {
public function hello() {
echo "Trait1::hello<br/>";
}
public function hi() {
echo "Trait1::hi<br/>";
}
}
trait Trait2 {
public function hello() {
echo "Trait2::hello<br/>";
}
public function hi() {
echo "Trait2::hi<br/>";
}
}
class Class1 {
use Trait1, Trait2 {
Trait2::hello insteadof Trait1;
Trait1::hi insteadof Trait2;
}
}
class Class2 {
use Trait1, Trait2 {
Trait2::hello insteadof Trait1;
Trait1::hi insteadof Trait2;
Trait2::hi as hei;
Trait1::hello as hehe;
}
}
$Obj1 = new Class1();
$Obj1->hello();
$Obj1->hi();
echo "<br/>";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();
~~~
輸出:
~~~
Trait2::hello
Trait1::hi
Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello
~~~
TP5tarit的用法:
<embed src="http://www.tudou.com/v/80AGv_9KZ4U/&bid=05&rpid=1059277519&resourceId=1059277519_05_05_99/v.swf" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" wmode="opaque" width="865" height="523"></embed>
下載地址:http://pan.baidu.com/s/1i4ZWdj3
TP5粉絲群: 543608226
TP5底層答疑群: 451935051