PHP trait

官方解釋

? ? ? ?自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了一種代碼復(fù)用的方法,稱為 trait。

? ? ? ?Trait是為類似 PHP 的單繼承語言而準(zhǔn)備的一種代碼復(fù)用機(jī)制(減少代碼重復(fù),增加代碼復(fù)用性)。

? ? ? ?Trait為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用 method。

? ? ? ?Trait 和 Class 組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和 Mixin 類相關(guān)典型問題。

? ? ? ?Trait 和 Class 相似,但僅僅旨在用細(xì)粒度和一致的方式來組合功能。 無法通過 trait 自身來實(shí)例化。

優(yōu)先級(jí)

? ? ? ?從基類繼承的成員會(huì)被 trait 插入的成員所覆蓋。優(yōu)先順序是來自當(dāng)前類的成員覆蓋了 trait 的方法,而 trait 則覆蓋了被繼承的方法。

自身方法 > trait方法 > 繼承的方法

調(diào)用

  1. 聲明一個(gè)trait

  2. 在類中使用use引入trait

  3. 使用多個(gè)trait,用逗號(hào),隔開

沖突

? ? ? ?不同的trait,有同名的方法或?qū)傩裕谕瑫r(shí)引入是會(huì)產(chǎn)生沖突。可以使用insteadof或as來解決。insteadof是替代,as是取別名,as還可以用來修改方法的訪問控制。

其他

? ? ? ?trait可以互相組合,一個(gè)trait中可以引入其他trait(也是使用use)。trait可以使用抽象方法,靜態(tài)方法,靜態(tài)屬性等

代碼如下

<?php
trait Hello{
        public function sayHello(){
                echo "trait Hello: Hello ";
        }

}

trait World{
        public function sayHello(){
                echo "trait World : Hello ";
        }

        public function sayWorld(){
                echo "world";
        }

        abstract public function getName();

        public static function eat(){
                echo "\neat: eat lunch\n";
        }
}

trait Access{
        protected function accessControll(){
                echo "access controll\n";
        }
}

class Test{
        use Hello, World, Access{
                Hello::sayHello insteadof World;
                World::sayHello as say;
                Access::accessControll as public;

        }

        public function sentenseEnd(){
                echo "!\n";
        }

        public function getName(){
                echo "getName\n";
        }
}

$obj = new Test();
$obj->sayHello();
$obj->sayWorld();
$obj->sentenseEnd();
$obj->say();
Test::eat();
$obj->getName();
Test::accessControll();
echo "\n";
Hello::sayHello();//直接調(diào)用

輸出結(jié)果:
trait Hello: Hello world!
trait World : Hello 
eat: eat lunch
getName
access controll

trait Hello: Hello

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.肚子疼 “護(hù)士,我現(xiàn)在覺得好像有點(diǎn)肚子疼了。”我微笑著對著從廁所剛出來的護(hù)士小美女說。 護(hù)士一邊關(guān)廁所門一邊看...
    頑皮豬閱讀 364評論 1 1
  • 文/陳慕 織完這條圍巾,我們就算翻篇了。 你說很羨慕我,想什么就去做,我卻很羨慕那些一成不變的人,他們永遠(yuǎn)保持一顆...
    我是陳慕閱讀 1,009評論 2 4
  • 白灰的墻沿 亮灰亮灰 一個(gè)巴掌 一片拼圖 一只兔子 搖啊搖
    在上帝與螞蟻之間閱讀 112評論 1 1

友情鏈接更多精彩內(nèi)容