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