ホームページ  >  記事  >  バックエンド開発  >  PHPは単一継承ですか?

PHPは単一継承ですか?

(*-*)浩
(*-*)浩オリジナル
2019-09-29 10:45:532623ブラウズ

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。