PHP之Trait詳解 轉

2022-03-13 02:07:36 字數 2655 閱讀 6266

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,然後...