首頁 >後端開發 >php教程 >php中trait是什麼意思? php中trait的簡單介紹

php中trait是什麼意思? php中trait的簡單介紹

不言
不言原創
2018-09-14 16:46:026790瀏覽

這篇文章帶給大家的內容是關於php中trait是什麼? php中trait的簡單介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

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 &#39;i can gps&#39;;
    }
}

使用 trait 定義了一個 GPS 的 trait 用來重複使用,它的關鍵字是 trait 。然後在 car.php 和 mobile.php 中進行引用。

car.php 的定義:

class Car {
    use gps;

    public function move() {
        echo &#39;i can move&#39;;
    }
}

mobile.php 的定義:

<?php

class Mobile {
    use gps;
    public function tel() {
        echo &#39;i can tel&#39;;
    }
}

在car.php 和mobile.php 中,使用use 關鍵字引入了gps 的trait ,這樣在car 和mobile 中就可以呼叫gps() 這個方法了。

test.php 進行測試:

<?php
require_once(&#39;gps.php&#39;);
require_once(&#39;car.php&#39;);
require_once(&#39;mobile.php&#39;);
$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 &#39;i can chinae gps&#39;;
    }
}

在car 中引入,修改car.php 的定義如下:

<?php
class Car {
    use gps, gpschina;    
    public function move() {
        echo &#39;i can move&#39;;
    }
}

再次呼叫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 &#39;i can move&#39;;
    }
}

這樣就使用 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 &#39;car::gps&#39;;
    }
    

    public function move() {
        echo &#39;i can move&#39;;
    }
}

呼叫 test.php 查看結果:

1 car::gps
2 i can gps

可以看出,呼叫了 Car 類別本身的 gps() 方法。

如果在一個類別中,繼承自父類別的方法、use 引入trait 的方法和類別自身的方法同名的話,優先調用自身類別的方法,如果沒有自身類別的方法則呼叫use 引入trait的方法,如果前兩個都沒有,那麼就呼叫繼承自父類別的方法。

相關推薦:

php中trait的意義是什麼呢?

什麼是Trait? php中Trait的申明與使用技巧分享

以上是php中trait是什麼意思? php中trait的簡單介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn