欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

php代碼復(fù)用機(jī)制詳細(xì)介紹

本篇內(nèi)容介紹了“php代碼復(fù)用機(jī)制詳細(xì)介紹”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)建站的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無止境。

提到 php 的代碼復(fù)用,我們可能第一時(shí)間會(huì)想到繼承,但是這種單繼承語言一旦派生的子類過多,那么會(huì)產(chǎn)生一系列的問題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒有更好的方法來實(shí)現(xiàn)代碼復(fù)用呢?

自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了另外一種代碼復(fù)用的一個(gè)方法,稱為 traits。

Traits 是一種為類似 PHP 的單繼承語言而準(zhǔn)備的代碼復(fù)用機(jī)制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨(dú)立的類中復(fù)用方法集。Traits 和類組合的語義是定義了一種方式來減少復(fù)雜性,避免傳統(tǒng)多繼承和混入類(Mixin)相關(guān)的典型問題。

基礎(chǔ)使用方法

Traits 的使用非常簡(jiǎn)單,只需要在類中使用 use 關(guān)鍵字即可。

trait A {
    public function test() {
        echo 'trait A::test()';
    }
}


class b {
    use A;
}
$b=new b();
$b->test();

優(yōu)先級(jí)

簡(jiǎn)單來說 Trait 優(yōu)先級(jí)大于父類方法,但是小于當(dāng)前類方法。

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沖突問題

在使用多個(gè) Trait 時(shí),如果其中存在相同的方法名稱,那么就會(huì)產(chǎn)生沖突。使用 insteadof 和 as 可以解決方法名稱沖突問題

insteadof可以聲明使用兩個(gè)相同方法名稱中的具體某個(gè)方法。

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 明確使用哪個(gè)方法
        B::test as testB;//使用 as 修改另外一個(gè)方法名稱,必須在使用 insteadof 解決沖突后使用
    }
}
$c=new c();
$c->test();//trait A::test()
$c->testB();//trait B::test()

方法訪問控制

使用 as 關(guān)鍵字我們可以對(duì) trait 方法的訪問權(quán)限進(jìn)行修改

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;//更改權(quán)限時(shí)還可以修改名稱
    }
}
$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支持抽象方法、支持靜態(tài)方法、不可以直接定義靜態(tài)變量,但靜態(tài)變量可被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

對(duì)比javascript

這種 trait use 的使用方法大概和 javascript 中的 call 有點(diǎn)相似,都是把一個(gè)另外一個(gè)對(duì)象掛載到當(dāng)前對(duì)象的執(zhí)行環(huán)境當(dāng)中。當(dāng)然 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

因?yàn)?javascript 中的變量環(huán)境是基于函數(shù)的,所以會(huì)輸出a

“php代碼復(fù)用機(jī)制詳細(xì)介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

當(dāng)前名稱:php代碼復(fù)用機(jī)制詳細(xì)介紹
文章分享:http://chinadenli.net/article14/gosede.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作企業(yè)建站App設(shè)計(jì)Google企業(yè)網(wǎng)站制作商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司