這篇文章帶給大家的內容是關於php中trait是什麼? php中trait的簡單介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
什麼是 trait?
看看 PHP 官網的介紹。
自 PHP 5.4.0 起,PHP 實作了程式碼重複使用的方法,稱為 trait。
Trait 是為類似 PHP 的單繼承語言而準備的程式碼重複使用機制。 Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別中重複使用 method。 Trait 和 Class 組合的語意定義了一種減少複雜性的方式,避免傳統多繼承和 Mixin 類別相關典型問題。
Trait 和 Class 相似,但只是旨在以細粒度和一致的方式來組合功能。無法透過 trait 自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承。
範例1
手機和汽車都有 GPS 功能,GPS 是用來定位的功能的,因此功能應該是統一的。手機 和 汽車 除了 GPS 功能外,基本上沒有什麼相同之處,因此不能使用繼承。而介面的話,我認為不同的類別去實作介面時,介面的實作可能是不同的,但是 GPS 的功能就是用來定位的。因此使用 trait ,而不使用 class 和 interface,這是我的理解,不知道是否正確。
gps.php 的定義:
<?php trait Gps { public function gps() { echo 'i can gps'; } }
使用 trait 定義了一個 GPS 的 trait 用來重複使用,它的關鍵字是 trait 。然後在 car.php 和 mobile.php 中進行引用。
car.php 的定義:
class Car { use gps; public function move() { echo 'i can move'; } }
mobile.php 的定義:
<?php class Mobile { use gps; public function tel() { echo 'i can tel'; } }
在car.php 和mobile.php 中,使用use 關鍵字引入了gps 的trait ,這樣在car 和mobile 中就可以呼叫gps() 這個方法了。
test.php 進行測試:
<?php require_once('gps.php'); require_once('car.php'); require_once('mobile.php'); $car = new Car(); $mobile = new Mobile(); $car->gps(); echo "\n"; $mobile->gps();
輸出結果如下:
1 i can gps 2 i can gps
範例2
在car 中引入了另外一個國產的gps 。
gpschina.php 定義如下:
<?php trait GpsChina { public function gps() { echo 'i can chinae gps'; } }
在car 中引入,修改car.php 的定義如下:
<?php class Car { use gps, gpschina; public function move() { echo 'i can move'; } }
再次呼叫test.php 進行測試,這時會報錯,報錯如下:
1 Fatal error: Trait method gps has not been applied, because there are collisions with other trait methods on Car in Car.php on line 4
因為在引入的trait 中gps 和gpschina 各有一個gps ,而直接使用$car->gps() 時無法確定到底使用的是gps 的gps() 方法,還是使用的gpschina 的gps() 方法,因此報錯了。這樣的話,我們需要確定一個。修改 car.php 檔案。
<?php class Car { use gps, gpschina { GpsChina::gps insteadof Gps; } public function move() { echo 'i can move'; } }
這樣就使用 GpsChina::gps 的方法 替換掉了 Gps 的方法了,在呼叫 test.php 進行檢視。
1 i can chinae gps 2 i can gps
這樣,對於 $car->gps() 後就呼叫了 gpschina 中的 gps() 方法了。
範例3
如果在 Car 類別中本身有一個 gps() 方法呢?修改 Car 類別。
<?php class Car { use gps, gpschina { GpsChina::gps insteadof Gps; } public function gps() { echo 'car::gps'; } public function move() { echo 'i can move'; } }
呼叫 test.php 查看結果:
1 car::gps 2 i can gps
可以看出,呼叫了 Car 類別本身的 gps() 方法。
如果在一個類別中,繼承自父類別的方法、use 引入trait 的方法和類別自身的方法同名的話,優先調用自身類別的方法,如果沒有自身類別的方法則呼叫use 引入trait的方法,如果前兩個都沒有,那麼就呼叫繼承自父類別的方法。
相關推薦:
以上是php中trait是什麼意思? php中trait的簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!