PHP是單繼承語言,無法多繼承,為了解決這個問題,在PHP5.4時出現了Trait,提供了一種程式碼複用機制。
用法: 通過在類中使用use 關鍵字,宣告要組合的Trait名稱,具體的Trait的宣告使用Trait關鍵詞,Trait不能例項化 。
例子:
<?php trait B { } class A { use B; }
Trait 是為類似 PHP 的單繼承語言而準備的一種程式碼複用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中複用 method。
當不同類都用到一些相同功能時就會出問題。例如,幾個類都需要生成單例,由於 PHP 不支援多繼承,那麼只能在每個類重複編寫程式碼,或者說將單例功能寫在父類中並讓這幾個類都繼承這個父類,這種繼承是無意義的。Trait 提供了這類問題的解決方案。
程式碼實現:
<?php
trait Singleton
{
private static $instance;
public static function getInstance() {
if (!(self::$instance instanceof self)) {
self::$instance = new self;
}
return self::$instance;
}
}
class Db
{
use Singleton;
}
class Log
{
use Singleton;
}
$db = Db::getInstance();
$log = Log::getInstance();
var_dump($db, $log);
列印結果如下:
class Db#1 (0) {
}
class Log#2 (0) {
}
由此實現了程式碼複用,多繼承的效果。
Trait優先順序
如果父類,當前類和Trait都有相同方法,優先順序則是如下:
當前類>Trait>父類
多個Trait衝突解決
- insteadof指定使用哪一個trait方法
use A, B { B::a insteadof A;//a方法衝突時使用B類的a方法而不使用A類的a方法 A::b insteadof B; //b方法衝突時使用A類的b方法而不使用B類的b方法 }
- 通過as關鍵字指定別名
use A, B { B::a as c; //宣告B類的a方法為c,作用於該類 A::b as d; //宣告A類的b方法為d,作用於該類 }
本作品採用《CC 協議》,轉載必須註明作者和本文連結