PHPで多重継承をシミュレートする方法

不言
リリース: 2023-04-02 13:40:02
オリジナル
1927 人が閲覧しました

この記事では、主に参考値のあるphpでの多重継承のシミュレーションを実装する方法を紹介します。今から皆さんに共有します。必要な友達は参考にしてください。

phpで多重継承のシミュレーションを実装する方法

1. 概要

一文の要約: 実際、他の人から継承するときは、他の人のクラスのメソッドとプロパティも呼び出したいので、次のようにすることができます。このクラスに対象クラスのオブジェクトを渡して渡します。このオブジェクトはメソッドやプロパティの呼び出しに使用され、継承よりも便利です。

2. マジック メソッド __call は多重継承のシミュレーションを実装します

1. 関連知識

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("妈妈");  
?>
ログイン後にコピー

コードの実行結果は次のとおりです:

インターフェイスの継承、2 つの抽象メソッドを実装する必要があります
通常料理をする人は次のとおりです: お母さん

上記の例はインターフェイスです。インターフェイスを継承するため、テスト クラスが fam インターフェイスを実装する場合、2 つの抽象メソッドをインスタンス化する必要があります。つまり、インターフェイスのサブクラスと親クラスの抽象メソッドの両方をインスタンス化する必要があります。

インターフェイスの多重継承の例を見てみましょう。コードは次のとおりです:

<?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("妈妈");  
?>
ログイン後にコピー

実行結果の例:

インターフェイスの継承実装する必要があります 2 つの抽象メソッド
私の名前は: Xiaoqiang
いつも料理をする人は: Mom

このコードは次の理由により継承されます。インターフェイス 2 つのインターフェイスの場合、これら 3 つの抽象クラスのすべての抽象メソッドをすべてのインスタンスに対してインスタンス化する必要があり、合計 3 つあります。これら 2 つの例を読んだ後は、インターフェイスの継承についてよく理解できるはずです。実際、関連するすべての抽象メソッドが実装されている限り、単一継承と多重継承が存在します。

上記がこの記事の全内容です。皆様の学習に少しでもお役に立てれば幸いです。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

PHP prepare での操作 mysqli 前処理

PHP マルチプロセス プログラミングの入門

PHP ポリモーフィズムの理解

以上がPHPで多重継承をシミュレートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート