摘要:是一種為類似的單繼承語言而準(zhǔn)備的代碼復(fù)用機制。因為中的變量環(huán)境是基于函數(shù)的,所以會輸出博客鏈接代碼復(fù)用機制,本文后續(xù)如有更新將會在博客更新。
提到 php 的代碼復(fù)用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類過多,那么會產(chǎn)生一系列的問題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒有更好的方法來實現(xiàn)代碼復(fù)用呢?
自 PHP 5.4.0 起,PHP 實現(xiàn)了另外一種代碼復(fù)用的一個方法,稱為 traits。
Traits 是一種為類似 PHP 的單繼承語言而準(zhǔn)備的代碼復(fù)用機制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨立的類中復(fù)用方法集。Traits 和類組合的語義是定義了一種方式來減少復(fù)雜性,避免傳統(tǒng)多繼承和混入類(Mixin)相關(guān)的典型問題。
基礎(chǔ)使用方法Traits 的使用非常簡單,只需要在類中使用 use 關(guān)鍵字即可。
trait A { public function test() { echo "trait A::test()"; } } class b { use A; } $b=new b(); $b->test();優(yōu)先級
簡單來說 Trait 優(yōu)先級大于父類方法,但是小于當(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沖突問題
在使用多個 Trait 時,如果其中存在相同的方法名稱,那么就會產(chǎn)生沖突。使用 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 關(guān)鍵字我們可以對 trait 方法的訪問權(quá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)限時還可以修改名稱 } } $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對比javascript
這種 trait use 的使用方法大概和 javascript 中的 call 有點相似,都是把一個另外一個對象掛載到當(dāng)前對象的執(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
因為 javascript 中的變量環(huán)境是基于函數(shù)的,所以會輸出a
博客鏈接:php 代碼復(fù)用機制--traits,本文后續(xù)如有更新將會在博客更新。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23039.html
摘要:和組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和類相關(guān)典型問題。隊列的目的是將耗時的任務(wù)延時處理,比如發(fā)送郵件,從而大幅度縮短請求和相應(yīng)的時間。同樣的道理,根據(jù)引入不同的來完成對應(yīng)的功能。 showImg(https://segmentfault.com/img/remote/1460000010868178); Trait 概念 在常規(guī)的 PHP 開發(fā)中,我們都習(xí)慣于先編寫一...
摘要:關(guān)于作者程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事和前端開發(fā),使用和,端使用混合式開發(fā)。和組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承和類相關(guān)典型問題。它為傳統(tǒng)繼承增加了水平特性的組合也就是說,應(yīng)用的幾個之間不需要繼承。 關(guān)于作者 程序開發(fā)人員,不拘泥于語言與技術(shù),目前主要從事PHP和前端開發(fā),使用Laravel和VueJs,App端使用Apicloud混合式開發(fā)。合適和...
摘要:在閱讀文檔的時候看到一個類是以聲明的。是一種代碼復(fù)用技術(shù),為的單繼承限制提供了一套靈活的代碼復(fù)用機制。下面把的代碼做一個修改以上代碼會輸出??梢钥闯鰞?yōu)先級的順序為,當(dāng)前類的優(yōu)先級基類。 ??在閱讀laravel文檔的時候看到一個類 是以 Trait聲明的。平時在工作中從來沒有用過,于是就去看了下官方文檔。原來這個類早在php5.4.0就有了。可惜在項目中從來沒有用過。 ??Trait看...
摘要:自起,實現(xiàn)了一種代碼復(fù)用的方法,稱為。為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結(jié)構(gòu)內(nèi)獨立的類中復(fù)用。優(yōu)先級從基類繼承的成員會被插入的成員所覆蓋。優(yōu)先順序是來自當(dāng)前類的成員覆蓋了的方法,而則覆蓋了被繼承的方法。 自 PHP 5.4.0 起,PHP 實現(xiàn)了一種代碼復(fù)用的方法,稱為 Trait。 Trait 是為類似 PHP 的單繼承語言而準(zhǔn)備的一種代碼復(fù)用機制。Trait ...
摘要:語言的一個問題是單繼承,這意味著類只能繼承一個其他的類。然而,很多情況下需要多繼承,比如繼承多個類的方法,以防止代碼的重復(fù)。和組合的語義定義了一種減少復(fù)雜性的方式,避免傳統(tǒng)多繼承問題。是一組方法,可以包含在類中進行使用,單不可實例化。 PHP語言的一個問題是單繼承,這意味著類只能繼承一個其他的類。然而,很多情況下需要多繼承,比如繼承多個類的方法,以防止代碼的重復(fù)。對于但繼承模式好還是多...
閱讀 1619·2023-04-25 14:12
閱讀 1085·2021-08-27 16:24
閱讀 2542·2019-08-30 15:44
閱讀 2921·2019-08-30 13:16
閱讀 1673·2019-08-29 14:10
閱讀 972·2019-08-29 13:54
閱讀 1306·2019-08-29 13:09
閱讀 1814·2019-08-26 18:37