編碼的世界 / 優質文選 / 文明

php中trait的使用


2022年7月13日
-   

php中trait的使用
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的單繼承限制提供了一套靈活的代碼複用機制。
附:以上是trait的基本使用,其還有幾個比較高級的使用注意點,詳細的使用方法可以參見PHP手冊,這裏給出鏈接:PHP手冊中trait的使用!以上內容中的例子都是來自於該手冊。
參考: 1. http://php.net/manual/zh/language.oop5.traits.php 2. http://laravelacademy.org/post/4281.html 3. http://www.jianshu.com/p/47f0cdbe9b2c

熱門文章