關於Trait

PHP 5.4.0 起,PHP 實現了一種代碼複用的方法,稱爲 Traitphp

Trait 是爲相似 PHP 的單繼承語言而準備的一種代碼複用機制。Trait 爲了減小單繼承語言的限制,使開發人員可以自由地在不一樣層次結構內獨立的類中複用 methodoop

  • trait看上去更像是爲了代碼的複用而寫的一個小插件,它相似於include 能夠用use放在類中間,讓trait裏面定義的方法做爲class的一部分 自己不能直接實例化,Trait的做用域在引用該Trait類的內部是均可見的(publicprivate 等等均可以) 能夠理解爲use關鍵字將Trait的實現代碼Copy了一份到引用該Trait的類中 。
<?php trait ezcReflectionReturnInfo {
    function getReturnType() { /*1*/ }
    function getReturnDescription() { /*2*/ }
}

class ezcReflectionMethod extends ReflectionMethod {
    use ezcReflectionReturnInfo;
    /* ... */ }

class ezcReflectionFunction extends ReflectionFunction {
    use ezcReflectionReturnInfo;
    /* ... */ } ?>

優先級

從基類繼承的成員會被 trait 插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。.net

<?php class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
} $o = new MyHelloWorld(); $o->sayHello();    #輸出:Hello, World! ?>
<?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 

經過逗號分隔,在 use 聲明列出多個 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 都插入了一個同名的方法,若是沒有明確解決衝突將會產生一個致命錯誤。code

引用地址:https://www.php.net/traits繼承

相關文章
相關標籤/搜索