首頁  >  文章  >  後端開發  >  如何實作php中模擬多繼承

如何實作php中模擬多繼承

不言
不言原創
2018-07-05 10:55:261917瀏覽

這篇文章主要介紹了關於如何實現php中模擬多繼承,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

php中模擬多繼承如何實現

一、總結

一句話總結:其實你繼承別人也是想呼叫別人類裡面的方法和屬性,所以可以這樣做:這本類別中創建目標類別的對象,然後透過這個物件來呼叫方法和屬性,這樣比繼承來的方便。

二、魔術方法 __call 實作模擬多繼承

1、相關知識

PHP沒有多繼承的特性。即使是支援多繼承的程式語言,我們也很少會使用這個特性。在多數人看來,多繼承不是好的設計方法。想要為某個類別增加額外的特性,不一定要使用繼承。這裡我提供一個模擬多繼承的方法以供參考。

PHP有一個魔術方法,叫做__call。當你呼叫一個不存在的方法時,這個方法會被自動呼叫。這時,我們就有機會將呼叫重新導向到一個存在的方法。繼承多個父類別的子類,尋找方法的過程一般是這樣的:

本身的方法->父類別1的方法-> 父類別2的方法...

模擬過程大致上是這樣:將各個父類別實例化,然後作為子類別的屬性。這些父類別提供一些公有的方法。 當子類別擁有某方法時,__call()函數不會被呼叫。這相當於「覆蓋」了父類別的方法。當呼叫了不存在的方法時,透過__call()方法依序從父類別中尋找可以呼叫的方法。雖然這不是完備的多重繼承,但可以幫助我們解決問題。

 1 <?php 
 2 class Parent1 { 
 3     function method1() {} 
 4     function method2() {} 
 5 } 
 6 class Parent2 { 
 7     function method3() {} 
 8     function method4() {}
 9 }
 10 class Child {
 11     protected $_parents = array();
 12     public function Child(array $parents=array()) {
 13         $_parents = $parents;
 14     }
 15      
 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中文網!

相關推薦:

 

PHP中的操作mysqli的預處理prepare

 

初步進行PHP多進程程式設計的介紹

 

關於PHP多型態的理解#

以上是如何實作php中模擬多繼承的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn