この記事では、主に参考値のあるphpでの多重継承のシミュレーションを実装する方法を紹介します。今から皆さんに共有します。必要な友達は参考にしてください。
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 のクラスは 1 つの親クラスのみを継承できます。複数のクラスを継承したい場合は、インターフェイスインターフェイスを使用する必要があります。多重継承をシミュレートするには3. PHPインターフェースにおける多重継承の詳細説明PHPインターフェースではインターフェースを継承することができます。 PHP クラスは 1 つの親クラス (単一継承) しか継承できませんが、インターフェイスはクラスとは異なり、
インターフェイスは複数の継承を実装できます および 1 つ以上のインターフェイスを継承できます。もちろん、 インターフェイスの継承では 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("妈妈"); ?>コードの実行結果は次のとおりです:
通常料理をする人は次のとおりです: お母さん |
<?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("妈妈"); ?>実行結果の例:
私の名前は: Xiaoqiang いつも料理をする人は: Mom |
以上がPHPで多重継承をシミュレートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。