php從以前到現在一直都是單繼承的語言,無法同時從兩個基類中繼承屬性和方法,為了解決這個問題,php出了trait這個特性如下**例項:
<?php
trait dog
}class animal
}class cat extends animal
}$cat = new cat();
$cat->drive();
echo "
";$cat->eat();
echo "
";$cat->bark();
?>
將會如下輸出
再測試trait、基類和本類對同名屬性或方法的處理,如下**
<?php
trait dog
public function eat()
}class animal
public function eat()
}class cat extends animal
}$cat = new cat();
$cat->drive();
echo "
";$cat->eat();
?>
如下顯示
所以:trait中的方法會覆蓋 基類中的同名方法,而本類會覆蓋trait中同名方法
注意點:當trait定義了屬性後,類就不能定義同樣名稱的屬性,否則會產生 fatal error,除非是設定成相同可見度、相同預設值。不過在php7之前,即使這樣設定,還是會產生e_strict 的提醒
乙個類可以組合多個trait,通過逗號相隔,如下
use trait1,trait2
當不同的trait中,卻有著同名的方法或屬性,會產生衝突,可以使用insteadof或 as進行解決,insteadof 是進行替代,而as是給它取別名
如下例項:
<?php
trait trait1
public function drive()
}trait trait2
public function drive()
}class cat
}class dog
}$cat = new cat();
$cat->eat();
echo "
";$cat->drive();
echo "
";echo "
";echo "
";$dog = new dog();
$dog->eat();
echo "
";$dog->drive();
echo "
";$dog->eaten();
echo "
";$dog->driven();
?>
輸出如下
as 還可以修改方法的訪問控制
<?php
trait animal
}class dog
}class cat
}$dog = new dog();
$dog->eat();//報錯,因為已經把eat改成了保護
$cat = new cat();
$cat->eat();//正常執行,不會修改原先的訪問控制
$cat->eaten();//報錯,已經改成了私有的訪問控制
?>
trait也可以互相組合,還可以使用抽象方法,靜態屬性,靜態方法等,例項如下
<?php
trait cat
}trait dog
abstract public function getname();
public function test()
public static function say()
}class animal
}$animal = new animal();
$animal->getname();
echo "
";$animal->eat();
echo "
";$animal->drive();
echo "
";$animal::say();
echo "
";$animal->test();
echo "
";$animal->test();
?>
輸出如下
PHP 特性之 trait 二
前面我們介紹了trait的基本使用,下面來介紹下trait比較複雜的用法使用多個traittrait member trait admin class showmember member new showmember member info member show 直接使用,逗號隔開,以上程式將會輸...
PHP型別轉詳解
因為php是弱型別語言,所以在型別轉換時會進行隱性轉換,從而產生一些 1.在進行比較邏輯運算時的轉換規則 一 如果比較乙個整數和字串,則字串會被轉換為整數。字串轉換為整數的規則如下 當乙個字串被當作數字來求值時,根據以下規則來決定結果的型別和值。如果包括 e 或 e 其中任何乙個字元的話,字串被當作...
PHP深度學習(1) 性狀 trait
文章參考了 modern php josh lockhart 性狀是在5.4版本推出的。個人認為,性狀是繼承和介面的一種中間態,或者說可以模組化實現的介面。應用情景如下 假定我們想要構建兩個類,robot和car,然後我們希望能同時為這兩個類新增gps功能。第一種實現方法,先構建乙個父類gps,然後...