php中關於traits復用機制的使用詳解

黄舟
發布: 2023-03-15 20:12:02
原創
1469 人瀏覽過

提到php 的程式碼重複使用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類別過多,那麼會產生一系列的問題,例如依賴父類別、耦合性太大、破壞了類別的封裝性。那麼有沒有更好的方法來實現程式碼復用呢?

自 PHP 5.4.0 起,PHP 實作了另一個程式碼重複使用的一個方法,稱為 traits。

Traits 是一種為類似 PHP 的單繼承語言而準備的程式碼重複使用機制。 Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類別中復用方法集。 Traits 和類別組合的語義是定義了一種方式來減少複雜性,避免與傳統多繼承和混入類別(Mixin)相關的典型問題。

基礎使用方法

Traits 的使用非常簡單,只需要在類別中使用 use 關鍵字。

trait A {    public function test() {
        echo 'trait A::test()';
    }
}class b {
    use A;
}$b=new b();$b->test();
登入後複製

優先權

簡單來說 Trait 優先權大於父類別方法,但是小於目前類別方法。

trait A {    public function test() {
        echo 'trait A::test()';
    }    public function test1() {
        echo 'trait A::test1()';
    }    
}class base{
    public function test(){
        echo 'base::test()';
    }    public function test1(){
        echo 'base::test1()';
    }    
}class b extends base{
    use A;    public function test(){
        echo 'b::test()';
    }
}$b=new b();$b->test();//b::test()$b->test1();//trait A::test1()
登入後複製

Trait衝突問題

在使用多個 Trait 時,如果其中存在相同的方法名稱,那麼就會產生衝突。使用 insteadof 和 as 可以解決方法名稱衝突問題

insteadof可以宣告使用兩個相同方法名稱中的具體某個方法。

trait A {    public function test() {
        echo 'trait A::test()';
    } 
}trait B {    public function test() {
        echo 'trait B::test()';
    } 
}class c{
    use A,B{        A::test insteadof B;//使用 insteadof 明确使用哪个方法
        B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用
    }
}$c=new c();$c->test();//trait A::test()$c->testB();//trait B::test()
登入後複製

方法存取控制

使用as 關鍵字我們可以對trait 方法的存取權限進行修改

trait A {    public function test() {
        echo 'trait A::test()';
    } 
    private function test1(){
        echo 'trait A::test1()';
    }
}class b{
    use A{        test as protected;
        test1 as public test2;//更改权限时还可以修改名称
    }
}$b=new b();$b->test();//Fatal error: Call to protected method b::test()$b->test2();//trait A::test1()
登入後複製

Trait嵌套使用

 trait A {        public function test1() {
            echo 'test1';
        }
    }    trait B {        public function test2() {
            echo 'test2';
        }
    }    trait C {        use A,B;
    }    class D {
        use C;
    }    $d = new D();    $d->test2();  //test2
登入後複製

變數、屬性、方法定義

Trait可定義屬性,但類別中不能定義同樣名稱屬性

 trait A {       
 public $test1;
    }    class B {
        use A;        
        public $test;        
        public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B...
    }
登入後複製

Trait支援抽象方法、支援靜態方法、不可以直接定義靜態變量,但靜態變數可被trait方法引用。

  trait A {        
  public function test1() {
            static $a = 0;            
            $a++;            
            echo $a;
        }        
        abstract public function test2(); //可定义抽象方法
    }    
    class B 
    {
        use A;        
        public function test2() {

        }
    }    
    $b = new B();    
    $b->test1(); //1
    $b->test1(); //2
登入後複製

比較javascript

這種 trait use 的使用方法大概和 javascript 中的 call 有點相似,都是把一個另一個物件掛載到目前物件的執行環境當中。當然 javascript 是基於原型的語言。兩者也沒有可比性。僅僅是使用方法相差無幾,有助於理解。

function a() {
    this.name="a";    this.getName=function(){
        console.log(this.name);
    }
}function b(){
    this.name="b";
    a.call(this);
}var b = new b();     
b.getName();//a
登入後複製

以上是php中關於traits復用機制的使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!