首頁 >後端開發 >PHP問題 >深入解析PHP trait

深入解析PHP trait

王林
王林轉載
2019-08-20 16:59:243005瀏覽

自PHP5.4.0起,PHP實作了一種程式碼重複使用的方法,稱為trait

眾所周知,PHP中是單繼承的,trait是為類似PHP的單繼承語言而準備得一種程式碼重複使用機制。 trait為了減少單一繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別中重複使用method。 trait和class組合的語意定義了一種減少複雜性的方式,避免傳統多繼承問題。

traitclass相似,但只是用細粒度和一致的方式來組合功能。無法透過trait本身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個class之間不需要繼承。

推薦PHP影片教學:https://www.php.cn/course/list/29/type/2.html

1、簡單的例子

首先我們舉個例子來介紹trait,和類別定義相似,但使用關鍵字trait定義。在類別中使用use組合。

<?php
trait T{
    public function t1(){
        return &#39;t1&#39;;
    }
    public function t2(){
        return &#39;t2&#39;;
    }
}
class Demo{
    use T;
    public function test(){
        return &#39;test&#39;;
    }多个
}
$demo = new Demo;
echo $demo->t1(),&#39;</br>&#39;;
echo $demo->test();

輸出結果:

t1

test

2、多個trait衝突解決

如果使用多個trait,但是出現了方法名稱相同,這就出現了衝突,就要手動指定使用哪個trait的方法,使用

insteadof

關鍵字實現。

<?php
trait T{
    public function t1(){
        return &#39;t1&#39;;
    }
 
 
    public function t2(){
        return &#39;t2&#39;;
    }
}
 
 
trait T2{
    public function t1(){
        return &#39;t3&#39;;
    }
}
 
 
class Demo{
    use T,T2{
        //使用T的m1方法
        T::t1 insteadof T2;
    }
    public function test(){
        return &#39;test&#39;;
    }
}
 
 
$demo = new Demo;
echo $demo->t1(),&#39;</br>&#39;;
echo $demo->test();

輸出結果:t1

test

#在衝突的時候,也可以使用use定義方法別名來解決衝突,範例如下:

<?php
trait T{
    public function t1(){
        return &#39;t1&#39;;
    }
 
 
    public function t2(){
        return &#39;t2&#39;;
    }
}
 
 
trait T2{
    public function t1(){
        return &#39;t3&#39;;
    }
}
 
 
class Demo{
    use T,T2{
        //使用T的m1方法
        T::t1 insteadof T2;
        T2::t1 as new_t1;
    }
    public function test(){
        return &#39;test&#39;;
    }
}
 
 
$demo = new Demo;
echo $demo->t1(),&#39;</br>&#39;;
echo $demo->new_t1(),&#39;</br>&#39;;
echo $demo->test();

輸出結果:

t1

深入解析PHP traitt3

#test

3、改變存取權

############################ #####也可以使用###use###關鍵字來改變方法的存取權。 ###
<?php
trait T{
    public function t1(){
        return &#39;t1&#39;;
    }
 
 
    public function t2(){
        return &#39;t2&#39;;
    }
}
 
 
class Demo{
    use T{
        t2 as protected;
    }
    public function test(){
        return &#39;test&#39;;
    }
}
 
 
$demo = new Demo;
echo $demo->t1(),&#39;</br>&#39;;
echo $demo->t2(),&#39;</br>&#39;;
echo $demo->test();
###輸出結果:###############上面知識介紹了一些常用的特性,詳細可參考官方手冊:#########https ://www.php.net/manual/zh/language.oop5.traits.php#############更多PHP相關問題可以存取PHP中文網:###https:// www.php.cn/#########謝謝! ###

以上是深入解析PHP trait的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除