首頁 >後端開發 >PHP問題 >php是單一繼承嗎

php是單一繼承嗎

(*-*)浩
(*-*)浩原創
2019-09-29 10:45:532669瀏覽

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

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中文網其他相關文章!

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