PHP之Trait

lemon_lyue發表於2020-11-17

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衝突解決

  1. insteadof指定使用哪一個trait方法
    use A, B {
    B::a insteadof A;//a方法衝突時使用B類的a方法而不使用A類的a方法
    A::b insteadof B; //b方法衝突時使用A類的b方法而不使用B類的b方法
    }
  2. 通過as關鍵字指定別名
    use A, B {
    B::a as c; //宣告B類的a方法為c,作用於該類
    A::b as d; //宣告A類的b方法為d,作用於該類
    }
本作品採用《CC 協議》,轉載必須註明作者和本文連結
lemon_lyue

相關文章