PHP 神奇又有用的 Trait
php和java,c++一樣都是單繼承模式。但是像python,是支援多繼承(即Mixin模式)。那麼如何在php中實現多繼承模式?這就需要使用trait。
Trait使用方式:
Trait使用場景
-
有些功能不需要類的方法屬性,但是在不同的類都有使用需求。例如上面的物件轉陣列方法。
這種情況可以使用一個基類定義toArray方法,則需要將這類基礎方法定義在儘可能頂層的基類當中,保證所有的類都能夠呼叫這個方法。
-
類因為某些需求,已經繼承了第三方類物件。例如第三方orm模型類。這種情況如果要給類附加一些公共的功能,除了建立一個繼承於orm模型的基類,複製一套公共功能的程式碼之外,就可以使用trait。
trait使用注意
方法優先順序
上面輸出內容分別為 model:model
, trait:model2
, model:model
, trait:model2
.可以看出,trait方法優先順序為 當前物件>trait>父類 ,以上規則同樣使用於靜態呼叫。
屬性定義要特別小心!!trait中可以定義屬性。但是不能和 use
trait當前類定義的屬性相同,否則會報錯: define the same property
。但是,如果父類使用了trait,子類定義trait中存在的屬性,則沒有問題。
私有屬性私有方法。triat中可以方位use類的私有屬性私有方法!!
從以上可以看出,trait本身是對類的一個擴充套件,在trait中使用 $this
, self
, static
, parent
都與當前類一樣,zend底層將trait程式碼嵌入到類當中,相當於底層幫我們實現了程式碼複製功能。
多個trait相同方法。
多trait相同的方法,需要使用instanceof 指定使用哪個trait的方法。instanceof後面的使用的trait。可以使用as設定新增方法別名(新增,原有方法還是能呼叫!!)。as還可以改變方法的訪問控制
Arrayabletrait2::logname as private
改為私有方法。