国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

php 代碼復用機制--traits

yedf / 2365人閱讀

摘要:是一種為類似的單繼承語言而準備的代碼復用機制。因為中的變量環境是基于函數的,所以會輸出博客鏈接代碼復用機制,本文后續如有更新將會在博客更新。

提到 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

因為 javascript 中的變量環境是基于函數的,所以會輸出a

博客鏈接:php 代碼復用機制--traits,本文后續如有更新將會在博客更新。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23039.html

相關文章

  • 簡述我所理解的 PHP Trait

    摘要:和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和類相關典型問題。隊列的目的是將耗時的任務延時處理,比如發送郵件,從而大幅度縮短請求和相應的時間。同樣的道理,根據引入不同的來完成對應的功能。 showImg(https://segmentfault.com/img/remote/1460000010868178); Trait 概念 在常規的 PHP 開發中,我們都習慣于先編寫一...

    gecko23 評論0 收藏0
  • 關于PHP的Trait特性

    摘要:關于作者程序開發人員,不拘泥于語言與技術,目前主要從事和前端開發,使用和,端使用混合式開發。和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承和類相關典型問題。它為傳統繼承增加了水平特性的組合也就是說,應用的幾個之間不需要繼承。 關于作者 程序開發人員,不拘泥于語言與技術,目前主要從事PHP和前端開發,使用Laravel和VueJs,App端使用Apicloud混合式開發。合適和...

    wind3110991 評論0 收藏0
  • PHP 特性之 trait (一)

    摘要:在閱讀文檔的時候看到一個類是以聲明的。是一種代碼復用技術,為的單繼承限制提供了一套靈活的代碼復用機制。下面把的代碼做一個修改以上代碼會輸出??梢钥闯鰞炏燃壍捻樞驗?,當前類的優先級基類。 ??在閱讀laravel文檔的時候看到一個類 是以 Trait聲明的。平時在工作中從來沒有用過,于是就去看了下官方文檔。原來這個類早在php5.4.0就有了??上г陧椖恐袕膩頉]有用過。 ??Trait看...

    ermaoL 評論0 收藏0
  • 關于Trait

    摘要:自起,實現了一種代碼復用的方法,稱為。為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用。優先級從基類繼承的成員會被插入的成員所覆蓋。優先順序是來自當前類的成員覆蓋了的方法,而則覆蓋了被繼承的方法。 自 PHP 5.4.0 起,PHP 實現了一種代碼復用的方法,稱為 Trait。 Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。Trait ...

    My_Oh_My 評論0 收藏0
  • 玩轉PHP的Trait

    摘要:語言的一個問題是單繼承,這意味著類只能繼承一個其他的類。然而,很多情況下需要多繼承,比如繼承多個類的方法,以防止代碼的重復。和組合的語義定義了一種減少復雜性的方式,避免傳統多繼承問題。是一組方法,可以包含在類中進行使用,單不可實例化。 PHP語言的一個問題是單繼承,這意味著類只能繼承一個其他的類。然而,很多情況下需要多繼承,比如繼承多個類的方法,以防止代碼的重復。對于但繼承模式好還是多...

    hikui 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<