PHP魔术常量trait
生活随笔
收集整理的這篇文章主要介紹了
PHP魔术常量trait
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作用:PHP中使用trait關鍵字是為了解決一個類既想集成基類的屬性和方法,又想擁有別的基類的方法,而trait一般情況下是和use搭配使用的。trait就是解決了繼承只能繼承一個的缺陷? 實例:
<?phptrait Drive {public $carName = 'trait';public function driving() {echo "driving {$this->carName}\n";}}class Person {public function eat() {echo "eat\n";}}class Student extends Person {use Drive;public function study() {echo "study\n";}}$student = new Student();$student->study();$student->eat();$student->driving();//www.jb51.net/article/114247.htm?> study eat driving traitStudent類通過繼承Person,有了eat方法,通過組合Drive,有了driving方法和屬性carName。 如果Trait、基類和本類中都存在某個同名的屬性或者方法,最終會保留哪一個呢?結論當方法或屬性同名時,當前類中的方法會覆蓋trait方法,而 trait 的方法又覆蓋了基類中的方法。
<?php trait Drive {public function hello() {echo "hello drive\n";}public function driving() {echo "driving from drive\n";}}class Person {public function hello() {echo "hello person\n";}public function driving() {echo "driving from person\n";}}class Student extends Person {use Drive;public function hello() {echo "hello student\n";}}$student = new Student();$student->hello();$student->driving(); ?> hello student driving from drive 結論當方法或屬性同名時,當前類中的方法會覆蓋trait方法,而 trait 的方法又覆蓋了基類中的方法。?多個trait重名的時候會有fatal error
如果要組合多個Trait,通過逗號分隔 Trait名稱: use Trait1, Trait2; 如果多個Trait中包含同名方法或者屬性時,會怎樣呢? 答案是當組合的多個Trait包含同名屬性或者方法時,需要明確聲明解決沖突,否則會產生一個致命錯誤。 PHP Fatal error: Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20<?php trait Trait1 {public function hello() {echo "Trait1::hello\n";}public function hi() {echo "Trait1::hi\n";} } trait Trait2 {public function hello() {echo "Trait2::hello\n";}public function hi() {echo "Trait2::hi\n";} } class Class1 {use Trait1, Trait2; } ?>使用insteadof和as操作符來解決沖突,
使用insteadof和as操作符來解決沖突, insteadof是使用某個方法替代另一個,而as是給方法取一個別名,具體用法請看代碼<?php trait Trait1 {public function hello() {echo "Trait1::hello\n";}public function hi() {echo "Trait1::hi\n";} } trait Trait2 {public function hello() {echo "Trait2::hello\n";}public function hi() {echo "Trait2::hi\n";} } class Class1 {use Trait1, Trait2 {Trait2::hello insteadof Trait1;Trait1::hi insteadof Trait2;} } class Class2 {use Trait1, Trait2 {Trait2::hello insteadof Trait1;Trait1::hi insteadof Trait2;Trait2::hi as hei;Trait1::hello as hehe;} } $Obj1 = new Class1(); $Obj1->hello(); $Obj1->hi(); echo "\n"; $Obj2 = new Class2(); $Obj2->hello(); $Obj2->hi(); $Obj2->hei(); $Obj2->hehe(); ?>Trait2::hello Trait1::hiTrait2::hello Trait1::hi Trait2::hi Trait1::helloTrait 也能組合Trait,Trait中支持抽象方法、靜態屬性及靜態方法
as關鍵詞還有另外一個用途,那就是修改方法的訪問控制: Trait 也能組合Trait,Trait中支持抽象方法、靜態屬性及靜態方法,測試代碼如下:<?php trait Hello {public function sayHello() {echo "Hello\n";} } trait World {use Hello;public function sayWorld() {echo "World\n";}abstract public function getWorld();public function inc() {static $c = 0;$c = $c + 1;echo "$c\n";}public static function doSomething() {echo "Doing something\n";} } class HelloWorld {use World;public function getWorld() {return 'get World';} } $Obj = new HelloWorld(); $Obj->sayHello(); $Obj->sayWorld(); echo $Obj->getWorld() . "\n"; HelloWorld::doSomething(); $Obj->inc(); $Obj->inc(); ?>Hello World get World Doing something 1 2https://www.jb51.net/article/114247.htm
總結
以上是生活随笔為你收集整理的PHP魔术常量trait的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP的break与continue
- 下一篇: 儿童乳糖酶哪个牌子好(乳糖酶哪个牌子好)