摘要:原文鏈接是單繼承的語(yǔ)言,在出現(xiàn)之前,的類無(wú)法同時(shí)從兩個(gè)基類繼承屬性或方法。的和語(yǔ)言的組合功能類似,通過(guò)在類中使用關(guān)鍵字聲明要組合的名稱,而具體某個(gè)的聲明使用關(guān)鍵詞,不能直接實(shí)例化。
原文鏈接:http://tabalt.net/blog/php-tr...
PHP是單繼承的語(yǔ)言,在PHP 5.4 Traits出現(xiàn)之前,PHP的類無(wú)法同時(shí)從兩個(gè)基類繼承屬性或方法。php的Traits和Go語(yǔ)言的組合功能類似,通過(guò)在類中使用use關(guān)鍵字聲明要組合的Trait名稱,而具體某個(gè)Trait的聲明使用trait關(guān)鍵詞,Trait不能直接實(shí)例化。具體用法請(qǐng)看下面的代碼:
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類通過(guò)繼承Person,有了eat方法,通過(guò)組合Drive,有了driving方法和屬性carName。
如果Trait、基類和本類中都存在某個(gè)同名的屬性或者方法,最終會(huì)保留哪一個(gè)呢?通過(guò)下面的代碼測(cè)試一下:
hello(); $student->driving();
輸出結(jié)果如下:
hello student driving from drive
因此得出結(jié)論:當(dāng)方法或?qū)傩酝麜r(shí),當(dāng)前類中的方法會(huì)覆蓋 trait的 方法,而 trait 的方法又覆蓋了基類中的方法。
如果要組合多個(gè)Trait,通過(guò)逗號(hào)分隔 Trait名稱:
use Trait1, Trait2;
如果多個(gè)Trait中包含同名方法或者屬性時(shí),會(huì)怎樣呢?答案是當(dāng)組合的多個(gè)Trait包含同名屬性或者方法時(shí),需要明確聲明解決沖突,否則會(huì)產(chǎn)生一個(gè)致命錯(cuò)誤。
輸出結(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操作符來(lái)解決沖突,insteadof是使用某個(gè)方法替代另一個(gè),而as是給方法取一個(gè)別名,具體用法請(qǐng)看代碼:
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::helloas關(guān)鍵詞還有另外一個(gè)用途,那就是修改方法的訪問(wèn)控制:
hello(); # 報(bào)致命錯(cuò)誤,因?yàn)閔ello方法被修改成受保護(hù)的 $Obj2 = new Class2(); $Obj2->hello(); # 原來(lái)的hello方法仍然是公共的 $Obj2->hi(); # 報(bào)致命錯(cuò)誤,因?yàn)閯e名hi方法被修改成私有的Trait 也能組合Trait,Trait中支持抽象方法、靜態(tài)屬性及靜態(tài)方法,測(cè)試代碼如下:
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/20999.html
摘要:本文將會(huì)介紹自起,直至中增加的新特征。棄用的功能以下幾個(gè)功能被棄用,若在配置文件中啟用,則會(huì)在運(yùn)行時(shí)發(fā)出警告。該類的完整限定名是其中第一個(gè)反斜杠表示全局命名空間。目的在于模仿的不對(duì),目的是為了讓發(fā)布應(yīng)用程序更加方便。 截至目前(2014.2), PHP 的最新穩(wěn)定版本是 PHP5.5, 但有差不多一半的用戶仍在使用已經(jīng)不在維護(hù) [注] 的 PHP5.2, 其余的一半用戶在使用 PHP5...
摘要:是一種為類似的單繼承語(yǔ)言而準(zhǔn)備的代碼復(fù)用機(jī)制。因?yàn)橹械淖兞凯h(huán)境是基于函數(shù)的,所以會(huì)輸出博客鏈接代碼復(fù)用機(jī)制,本文后續(xù)如有更新將會(huì)在博客更新。 提到 php 的代碼復(fù)用,我們可能第一時(shí)間會(huì)想到繼承,但是這種單繼承語(yǔ)言一旦派生的子類過(guò)多,那么會(huì)產(chǎn)生一系列的問(wèn)題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒(méi)有更好的方法來(lái)實(shí)現(xiàn)代碼復(fù)用呢? 自 PHP 5.4.0 起,PHP 實(shí)現(xiàn)了另外...
摘要:概述是新進(jìn)入的特性,其目的就是解決的類不能多繼承的問(wèn)題。可以理解為一組能被不同的類都能調(diào)用到的方法集合。只需要在類中使用關(guān)鍵詞引入即可,可引入多個(gè),用隔開(kāi)。為了解決多個(gè)在同一個(gè)類中的命名沖突,需要使用操作符來(lái)明確指定使用沖突方法中的哪一個(gè)。 概述 traits是PHP5.4新進(jìn)入的特性,其目的就是解決PHP的類不能多繼承的問(wèn)題。Traits不是類!不能被實(shí)例化。可以理解為一組能被不同的...
摘要:雖然容易入門,但是要想深入,還是有些路要走的,今天我們就來(lái)聊聊一些比較難理解的知識(shí)點(diǎn)。至于的第三種用法請(qǐng)看下面的。如果大家覺(jué)得這篇文章還不錯(cuò),請(qǐng)給予一個(gè)贊或者分享給你的好友,如果你有更多好的經(jīng)驗(yàn)或問(wèn)題,請(qǐng)?jiān)谠u(píng)論中和大家分享一下。 php雖然容易入門,但是要想深入,還是有些路要走的,今天我們就來(lái)聊聊php一些比較難理解的知識(shí)點(diǎn)。use php從5.3.0開(kāi)始引入了一個(gè)叫作命名空間的新特征...
摘要:索性讀一下它的源碼。行載入類載入類,這個(gè)類比較重要,實(shí)現(xiàn)了自動(dòng)加載。注冊(cè)錯(cuò)誤和異常處理機(jī)制加載慣例配置文件接下來(lái)我們看一下自動(dòng)加載的實(shí)現(xiàn)方法。所以借助此函數(shù)可以達(dá)到自動(dòng)加載。博客鏈接解讀源碼一自動(dòng)加載 聽(tīng)說(shuō) TP5 已經(jīng) RC4 了,曾經(jīng)在 RC3 的時(shí)候用它寫過(guò)一個(gè)小東西。官方說(shuō)從 RC4 以后改動(dòng)不是太大。索性讀一下它的源碼。然后順便記錄一下,如有錯(cuò)漏,請(qǐng)路過(guò)大神多多指正! 入口 ...
閱讀 1773·2023-04-26 00:20
閱讀 1824·2021-11-08 13:21
閱讀 2019·2021-09-10 10:51
閱讀 1581·2021-09-10 10:50
閱讀 3314·2019-08-30 15:54
閱讀 2147·2019-08-30 14:22
閱讀 1440·2019-08-29 16:10
閱讀 3103·2019-08-26 11:50