本篇內(nèi)容介紹了“php代碼復用機制詳細介紹”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)建站的服務宗旨!把網(wǎng)站當作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設中就是為了建設一個不僅審美在線,而且實用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對網(wǎng)站設計、成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設計、網(wǎng)站優(yōu)化、網(wǎng)絡推廣、探索永無止境。
提到 php 的代碼復用,我們可能第一時間會想到繼承,但是這種單繼承語言一旦派生的子類過多,那么會產(chǎn)生一系列的問題,比如依賴父類、耦合性太大、破壞了類的封裝性。那么有沒有更好的方法來實現(xiàn)代碼復用呢?
自 PHP 5.4.0 起,PHP 實現(xiàn)了另外一種代碼復用的一個方法,稱為 traits。
Traits 是一種為類似 PHP 的單繼承語言而準備的代碼復用機制。Trait 為了減少單繼承語言的限制,使開發(fā)人員能夠自由地在不同層次結構內(nèi)獨立的類中復用方法集。Traits 和類組合的語義是定義了一種方式來減少復雜性,避免傳統(tǒng)多繼承和混入類(Mixin)相關的典型問題。
Traits 的使用非常簡單,只需要在類中使用 use 關鍵字即可。
trait A { public function test() { echo 'trait A::test()'; } } class b { use A; } $b=new b(); $b->test();
優(yōu)先級
簡單來說 Trait 優(yōu)先級大于父類方法,但是小于當前類方法。
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 關鍵字我們可以對 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支持抽象方法、支持靜態(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
這種 trait use 的使用方法大概和 javascript 中的 call 有點相似,都是把一個另外一個對象掛載到當前對象的執(zhí)行環(huán)境當中。當然 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代碼復用機制詳細介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
當前名稱:php代碼復用機制詳細介紹
文章分享:http://bm7419.com/article14/gosede.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、企業(yè)建站、App設計、Google、企業(yè)網(wǎng)站制作、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)