1、php中的trait是啥?
看上去既像類又像接口,其實都不是,Trait可以看做類的部分實現,可以混入一個或多個現有的PHP類中,其作用有兩個:表明類可以做什么;提供模塊化實現。Trait是一種代碼復用技術,為PHP的單繼承限制提供了一套靈活的代碼復用機制。
2、PHP版本要求:
php5.4開始引入trait,其目的就是在於減少代碼的重復,增加代碼的復用性。
3、trait的使用場景:
試想這樣一種情況,當有一個方法需要在很多的類中使用時,該怎么處理?
通常一般的處理方式會是,寫一個基礎類,在基類中實現這個方法,然后所有類都繼承這個基類。
這是一種處理方法,但不是最好的處理方式。通常采用繼承的情況是:幾個類具有很大的相似性。比如人作為一個基類,學生、工人、等繼承“人”這個基類來擴展。
由此,trait的作用就出來了,trait 可以在多個類中使用。
4、trait如何使用:
引用PHP手冊中的例子:
例子一
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}
class ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
1、先聲明一個trait;
2、在類中使用use將該trait引入。
是不是非常簡單(手動逃)?需要注意的是trait的優先級。
5、trait的優先級
(敲黑板)從基類繼承的成員會被 trait 插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。
優先級:自身方法>trait的方法>繼承的方法(就是這樣子的。)
看例子
<?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的使用。
<?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();
?>
總結:Trait是一種代碼復用技術,為PHP的單繼承限制提供了一套靈活的代碼復用機制。
---------------------
作者:lemony_liu
來源:CSDN
原文:https://blog.csdn.net/lemony521/article/details/78322652
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!