小編給大家分享一下PHP中trait的基礎語法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
類中的某些成員如何才能被其他類使用呢?使用繼承的話,這繼承鏈也太長了,php提供了代碼復用技術trait。
1.定義:Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。trait可以使得單繼承語言拜托為了復用而不得不繼承的尷尬,讓面向對象變得更加純粹。
2.基礎語法:
trait是一種類似class的關鍵字。
<?php
trait Eat{
public $a=10; //trait內允許有類的成員屬性(包括靜態屬性),成員方法(包括靜態方法)
public static $b=666;
//const c=3.14; //trait內不允許有常量
protected $e; //允許定義,但是實際不用
private $f;
public function getA()
{
echo $this->a,"<br>";
}
public static function getB()
{
echo self::$b,"<br>";
}
}
?>trait是用來實現代碼的復用的,不可以被實例化也不可以被繼承(不是類)。
<?php
trait Eat{}
// $a=new Eat;//報錯
//calss A extends Eat{}//報錯
?>3.trait的使用
trait只是一段代碼的集合,使用時必須要使用use進行引用。
<?php
trait Eat{
public $a=10;
public static $b=666;
//const c=3.14;
public function getA()
{
echo $this->a,"<br>";
}
public static function getB()
{
echo self::$b,"<br>";
}
}
class A{
use Eat;
public function getC()
{
echo $this->a,"<br>";
}
}
$boy=new A();
$boy->getC();
$boy->getA();
$boy->getB();
?>一個類可以使用多個trait。
<?php
trait A1{
}
trait A2{
}
class People{
use A1,A2;
}
?>4.trait使用的問題
a.如果同時引入的多個trait中有同名屬性,那么會產生沖突。
<?php
trait A1{
public $a=11;
}
trait A2{
public $a=22;
}
class A3{
use A1,A2;//不允許同名屬性
public function geta(){
echo $this->a;
}
}
$example=new A3();
?>b.如果同時引入的多個trait中有同名方法,那么會產生沖突,有兩種方案解決如A3、A4。
<?php
trait A1{
public $a=11;
public function eat(){
echo "A1中eat()方法","<br>";
}
}
trait A2{
public $b=22;
public function eat(){
echo "A2中eat()方法","<br>";
}
}
class A3{
use A1,A2{
A1::eat insteadOf A2; //A1中的eat替代A2中的eat
}
}
class A4{
use A1,A2{
A1::eat insteadOf A2;//A1中的eat替代A2中的eat
A2::eat as eat2; //A2中的eat取別名eat2
}
}
$example=new A3();
$example->eat();
$example=new A4();
$example->eat2();
?>c.同名覆蓋問題:如果類中有與引入的trait同名成員,會有不同處理:
屬性:不允許重名,即類中不允許定義與trait中同名的成員屬性(靜態屬性也一樣)。
方法:類覆蓋trait。
d.繼承覆蓋問題:如果類中在使用trait的同時,也是繼承自父類,而trait中與父類中有同名方法,那么trait中將覆蓋父類同名方法;如果要訪問父類方法,可以在trait同名方法中使用parent關鍵字訪問父類同名方法。
<?php
trait Eat{
public function eat(){
echo 'Eat::eat';
}
}
class Human{
public function eat(){
echo 'Human::eat';
}
}
//子類繼承父類同時使用trait
class Man extends Human{
use Eat;
}
$m = new Man();
$m->eat();
?>e.trait自己不能訪問,只是用來給其他類提供代碼復用的,因此允許類在使用trait時更高里面方法的訪問控制權:在as之后,使用目標訪問修飾限定符。
<?php
trait Eat{
private function show(){
echo 'eat';
}
}
class Human{
use Eat{
show as public eshow;
//注意:as是用來設定別名的,雖然沒有同名show,但是系統認為show已經存在,所以必須別名,權限的更改的方法不是
//本尊
}
}
$h = new Human();
$h->eshow(); //eat
?>f.trait中可以使用抽象方法,用來規范使用類必須實現對應抽象方法:使用類要么為抽象類,要么就必須實現抽象方法。
<?php
trait Eat{
public function eat(); //抽象方法
}
abstract class Human{
use Eat; //抽象類:可以不實現抽象方法
}
class Animal{
use Eat;
public function eat(){ //具體類:實現抽象方法
echo 'Animal::eat';
}
}
?>以上是“PHP中trait的基礎語法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。