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

資訊專欄INFORMATION COLUMN

PHP中的Traits詳解

Harriet666 / 2788人閱讀

摘要:原文鏈接是單繼承的語言,在出現(xiàn)之前,的類無法同時從兩個基類繼承屬性或方法。的和語言的組合功能類似,通過在類中使用關(guān)鍵字聲明要組合的名稱,而具體某個的聲明使用關(guān)鍵詞,不能直接實例化。

原文鏈接:http://tabalt.net/blog/php-tr...

PHP是單繼承的語言,在PHP 5.4 Traits出現(xiàn)之前,PHP的類無法同時從兩個基類繼承屬性或方法。php的Traits和Go語言的組合功能類似,通過在類中使用use關(guān)鍵字聲明要組合的Trait名稱,而具體某個Trait的聲明使用trait關(guān)鍵詞,Trait不能直接實例化。具體用法請看下面的代碼:

carName}
";
        }
    }
    class Person {
        public function eat() {
            echo "eat
";
        }
    }
    class Student extends Person {
        use Drive;
        public function study() {
            echo "study
";
        }
    }
    $student = new Student();
    $student->study();
    $student->eat();
    $student->driving();

輸出結(jié)果如下:

study
eat
driving trait

上面的例子中,Student類通過繼承Person,有了eat方法,通過組合Drive,有了driving方法和屬性carName。

如果Trait、基類和本類中都存在某個同名的屬性或者方法,最終會保留哪一個呢?通過下面的代碼測試一下:

hello();
    $student->driving();

輸出結(jié)果如下:

hello student
driving from drive

因此得出結(jié)論:當方法或?qū)傩酝麜r,當前類中的方法會覆蓋 trait的 方法,而 trait 的方法又覆蓋了基類中的方法。

如果要組合多個Trait,通過逗號分隔 Trait名稱:

use Trait1, Trait2;

如果多個Trait中包含同名方法或者屬性時,會怎樣呢?答案是當組合的多個Trait包含同名屬性或者方法時,需要明確聲明解決沖突,否則會產(chǎn)生一個致命錯誤。


輸出結(jié)果如下:

PHP Fatal error:  Trait method hello has not been applied, because there are collisions with other trait methods on Class1 in ~/php54/trait_3.php on line 20

使用insteadof和as操作符來解決沖突,insteadof是使用某個方法替代另一個,而as是給方法取一個別名,具體用法請看代碼:

hello();
$Obj1->hi();
echo "
";
$Obj2 = new Class2();
$Obj2->hello();
$Obj2->hi();
$Obj2->hei();
$Obj2->hehe();

輸出結(jié)果如下:

Trait2::hello
Trait1::hi

Trait2::hello
Trait1::hi
Trait2::hi
Trait1::hello

as關(guān)鍵詞還有另外一個用途,那就是修改方法的訪問控制:

hello(); # 報致命錯誤,因為hello方法被修改成受保護的
    $Obj2 = new Class2();
    $Obj2->hello(); # 原來的hello方法仍然是公共的
    $Obj2->hi();  # 報致命錯誤,因為別名hi方法被修改成私有的

Trait 也能組合Trait,Trait中支持抽象方法、靜態(tài)屬性及靜態(tài)方法,測試代碼如下:

sayHello();
$Obj->sayWorld();
echo $Obj->getWorld() . "
";
HelloWorld::doSomething();
$Obj->inc();
$Obj->inc();

輸出結(jié)果如下:

Hello
World
get World
Doing something
1
2

原文鏈接:http://tabalt.net/blog/php-tr...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/20999.html

相關(guān)文章

  • PHP 自 5.2 到 5.6 中新增的功能詳解

    摘要:本文將會介紹自起,直至中增加的新特征。棄用的功能以下幾個功能被棄用,若在配置文件中啟用,則會在運行時發(fā)出警告。該類的完整限定名是其中第一個反斜杠表示全局命名空間。目的在于模仿的不對,目的是為了讓發(fā)布應用程序更加方便。 截至目前(2014.2), PHP 的最新穩(wěn)定版本是 PHP5.5, 但有差不多一半的用戶仍在使用已經(jīng)不在維護 [注] 的 PHP5.2, 其余的一半用戶在使用 PHP5...

    番茄西紅柿 評論0 收藏0
  • php 代碼復用機制--traits

    摘要:是一種為類似的單繼承語言而準備的代碼復用機制。因為中的變量環(huán)境是基于函數(shù)的,所以會輸出博客鏈接代碼復用機制,本文后續(xù)如有更新將會在博客更新。 提到 php 的代碼復用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類過多,那么會產(chǎn)生一系列的問題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒有更好的方法來實現(xiàn)代碼復用呢? 自 PHP 5.4.0 起,PHP 實現(xiàn)了另外...

    yedf 評論0 收藏0
  • 【modernPHP專題(5)】類多繼承的替代方案Traits

    摘要:概述是新進入的特性,其目的就是解決的類不能多繼承的問題??梢岳斫鉃橐唤M能被不同的類都能調(diào)用到的方法集合。只需要在類中使用關(guān)鍵詞引入即可,可引入多個,用隔開。為了解決多個在同一個類中的命名沖突,需要使用操作符來明確指定使用沖突方法中的哪一個。 概述 traits是PHP5.4新進入的特性,其目的就是解決PHP的類不能多繼承的問題。Traits不是類!不能被實例化??梢岳斫鉃橐唤M能被不同的...

    imtianx 評論0 收藏0
  • PHP知識難點TOP3,挑戰(zhàn)一下你

    摘要:雖然容易入門,但是要想深入,還是有些路要走的,今天我們就來聊聊一些比較難理解的知識點。至于的第三種用法請看下面的。如果大家覺得這篇文章還不錯,請給予一個贊或者分享給你的好友,如果你有更多好的經(jīng)驗或問題,請在評論中和大家分享一下。 php雖然容易入門,但是要想深入,還是有些路要走的,今天我們就來聊聊php一些比較難理解的知識點。use php從5.3.0開始引入了一個叫作命名空間的新特征...

    mdluo 評論0 收藏0
  • 解讀 thinkphp5 源碼(一):自動加載

    摘要:索性讀一下它的源碼。行載入類載入類,這個類比較重要,實現(xiàn)了自動加載。注冊錯誤和異常處理機制加載慣例配置文件接下來我們看一下自動加載的實現(xiàn)方法。所以借助此函數(shù)可以達到自動加載。博客鏈接解讀源碼一自動加載 聽說 TP5 已經(jīng) RC4 了,曾經(jīng)在 RC3 的時候用它寫過一個小東西。官方說從 RC4 以后改動不是太大。索性讀一下它的源碼。然后順便記錄一下,如有錯漏,請路過大神多多指正! 入口 ...

    stormzhang 評論0 收藏0

發(fā)表評論

0條評論

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