PHP沒有多繼承的特性。即使是一門支持多繼承的編程語言,我們也很少會使用這個特性。在大多數人看來,多繼承不是一種好的設計方法。想要給某個類添加額外的特性,不一定要使用繼承。這里我提供一種模擬多繼承的方法以供參考。
PHP有一個魔術方法,叫做__call。當你調用一個不存在的方法時,這個方法會被自動調用。這時,我們就有機會將調用重定向到一個存在的方法。繼承多個父類的子類,尋找方法的過程一般是這樣的:
本身的方法 - 父類1的方法 - 父類2的方法...
模擬過程大致是這樣:將各個父類實例化,然后作為子類的屬性。這些父類提供一些公有的方法。當子類擁有某方法時,__call()函數不會被調用。這相當于“覆蓋”了父類的方法。當調用了不存在的方法時,通過__call()方法依次從父類中尋找可以調用的方法。雖然這不是完備的多繼承,但可以幫助我們解決問題。
1 ?php 2 html' target='_blank'>class Parent1 { 3 function method1() {} 4 function method2() {} 5 } 6 class Parent2 { 7 function method3() {} 8 function method4() {} 10 class Child { 11 protected $_parents = array(); 12 public function Child(array $parents=array()) { 13 $_parents = $parents; 14 } 16 public function __call($method, $args) { 17 // 從“父類 中查找方法 18 foreach ($this- _parents as $p) { 19 if (is_callable(array($p, $method))) { 20 return call_user_func_array(array($p, $method), $args); 21 } 22 } 23 // 恢復默認的行為,會引發一個方法不存在的致命錯誤 24 return call_user_func_array(array($this, $method), $args); 25 } 26 } 27 $obj = new Child(array(new Parent1(), new Parent2())); 28 $obj- method1(); 29 $obj- method3();
這里沒有涉及屬性的繼承,但實現起來并不困難??梢酝ㄟ^__set()和__get()魔術方法來模擬屬性的繼承。請你動手實踐。
其它方法:通過接口來實現多繼承
php中的類只能繼承一個父類,如果要繼承多個類應采用接口
interface 模擬多繼承
三、PHP接口實現多繼承詳解在PHP的接口中,接口可以繼承接口。雖然PHP類只能繼承一個父類(單繼承),但是接口和類不同,接口可以實現多繼承,可以繼承一個或者多個接口。當然接口的繼承也是使用extends關鍵字,要多個繼承的話只要用逗號把繼承的接口隔開即可。
需要注意的是當你接口繼承其它接口時候,直接繼承父接口的靜態常量屬性和抽象方法,所以類實現接口時必須實現所有相關的抽象方法。
現在你對PHP接口的繼承有所了解了吧,下面的例子可供參考,代碼如下:
?php interface father{ function shuchu(); interface fam extends father{ function cook($name); class test implements fam{ function shuchu(){ echo 接口繼承,要實現兩個抽象方法 echo br function cook($name){ echo 平時經常做飯的人是: .$name; $t=new test(); $t- shuchu(); $t- cook( 媽媽 ?
代碼運行結果如下:
接口繼承,要實現兩個抽象方法上面的示例是接口繼承了一個接口,所以在test類實現fam接口的時候要實例兩個抽象方法,就是把接口的子類和父類的抽象方法都實例。
下面來看一個接口多繼承的示例,代碼如下:
?php interface father{ function shuchu(); interface mother{ function dayin($my); interface fam extends father,mother{ function cook($name); class test implements fam{ function dayin($my){ echo 我的名字是: .$my; echo br function shuchu(){ echo 接口繼承,要實現兩個抽象方法 echo br function cook($name){ echo 平時經常做飯的人是: .$name; $t=new test(); $t- shuchu(); $t- dayin( 小強 $t- cook( 媽媽 ?
示例運行結果:
接口繼承,要實現兩個抽象方法這段代碼由于接口繼承了兩個接口,所有實例時要把這三個抽象類的所有抽象方法都實例,總共有三個??赐赀@兩個例子,你應該對接口的繼承熟悉了吧,其實就一個單繼承和多繼承,只要實現了所有相關的抽象方法就可以了。
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP !
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答