如何?php中類比多繼承

來源:互聯網
上載者:User
這篇文章主要介紹了關於如何?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("媽媽");  ?>

樣本運行結果:

介面繼承,要實現兩個抽象方法
我的名字是:小強
平時經常做飯的人是:媽媽

這段代碼由於介面繼承了兩個介面,所有執行個體時要把這三個抽象類別的所有抽象方法都執行個體,總共有三個。看完這兩個例子,你應該對介面的繼承熟悉了吧,其實就一個單繼承和多繼承,只要實現了所有相關的抽象方法就可以了。

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.