PHP沒有多繼承的特性。即使是支援多繼承的程式語言,我們也很少會使用這個特性。 在多數人看來,多繼承不是好的設計方法。想要為某個類別增加額外的特性,不一定要使用繼承。這裡我提供一個模擬多繼承的方法以供參考。
PHP有一個魔術方法,叫做__call。當你呼叫一個不存在的方法時,這個方法會被自動呼叫。
這時,我們就有機會將呼叫重定向到一個存在的方法。繼承多個父類的子類,尋找方法的過程一般是這樣的:(推薦學習:PHP視頻教程)
本身的方法 -> 父类1的方法 -> 父类2的方法...
模擬過程大致是這樣:將各個父類實例化,然後作為子類別的屬性。這些父類別提供一些公有的方法。當子類別擁有某方法時,__call()函數不會被呼叫。這相當於「覆蓋」了父類別的方法。
當呼叫了不存在的方法時,透過__call()方法依序從父類別中尋找可以呼叫的方法。雖然這不是完備的多繼承,但可以幫助我們解決問題。
<?php class Parent1 { function method1() {} function method2() {} } class Parent2 { function method3() {} function method4() {} } class Child { protected $_parents = array(); public function Child(array $parents=array()) { $_parents = $parents; } public function __call($method, $args) { // 从“父类"中查找方法 foreach ($this->_parents as $p) { if (is_callable(array($p, $method))) { return call_user_func_array(array($p, $method), $args); } } // 恢复默认的行为,会引发一个方法不存在的致命错误 return call_user_func_array(array($this, $method), $args); } } $obj = new Child(array(new Parent1(), new Parent2())); $obj->method1(); $obj->method3();
這裡沒有涉及屬性的繼承,但實作起來並不困難。可以透過__set()和__get()魔術方法來模擬屬性的繼承。
以上是php是單一繼承嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!