Comment simuler l'héritage multiple en php

不言
Libérer: 2023-04-02 13:40:02
original
1927 Les gens l'ont consulté

Cet article présente principalement comment implémenter l'héritage multiple simulé en php, qui a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Comment implémenter l'héritage multiple simulé en php.

1.Résumé

Résumé en une phrase : En fait, lorsque vous héritez des autres, vous souhaitez également appeler les méthodes et les propriétés des classes des autres, vous pouvez donc faire ceci : créer un objet de la classe cible dans cette classe, puis passez Cet objet est utilisé pour appeler des méthodes et des propriétés, ce qui est plus pratique que l'héritage.

2. La méthode magique __call implémente l'héritage multiple simulé

1. Connaissances connexes

PHP n'a pas la fonctionnalité d'héritage multiple. Même dans un langage de programmation prenant en charge l’héritage multiple, nous utilisons rarement cette fonctionnalité. De l’avis de la plupart des gens, l’héritage multiple n’est pas une bonne méthode de conception. Si vous souhaitez ajouter des fonctionnalités supplémentaires à une classe, vous n'avez pas nécessairement besoin d'utiliser l'héritage. Ici, je propose une méthode pour simuler l’héritage multiple pour référence.

PHP a une méthode magique appelée __call. Lorsque vous appelez une méthode qui n'existe pas, cette méthode sera automatiquement appelée . A ce stade, nous avons la possibilité de rediriger l’appel vers une méthode existante. Pour les sous-classes qui héritent de plusieurs classes parent, le processus de recherche de méthodes est généralement le suivant :

sa propre méthode -> méthode de la classe parent 1 -> 🎜>Le processus de simulation est à peu près le suivant :

Instanciez chaque classe parent puis utilisez-la comme attribut de la sous-classe. Ces classes parentes fournissent des méthodes publiques.

Lorsqu'une sous-classe possède une méthode, la fonction __call() ne sera pas appelée. Cela équivaut à « remplacer » la méthode de la classe parent. Lorsqu'une méthode qui n'existe pas est appelée, la méthode __call() est utilisée pour rechercher les méthodes qui peuvent être appelées à leur tour depuis la classe parent. Bien qu'il ne s'agisse pas d'un héritage multiple complet, cela peut nous aider à résoudre le problème.

Il n'y a pas d'héritage de propriétés en cause, mais ce n'est pas difficile à mettre en œuvre. L'héritage de propriété peut être simulé via les méthodes magiques __set() et __get(). Veuillez le pratiquer vous-même.
 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();
Copier après la connexion

Autres méthodes : implémentez l'héritage multiple via des interfaces

Les classes en php ne peuvent hériter que d'une seule classe parent. Si vous souhaitez hériter de plusieurs classes, vous devez utiliser des interfaces

interface pour. simuler plusieurs héritages

3. Explication détaillée de l'héritage multiple dans l'interface PHP

Dans les interfaces PHP, les interfaces peuvent hériter des interfaces. Bien que les classes PHP ne puissent hériter que d'une seule classe parent (héritage unique), les interfaces sont différentes des classes

Les interfaces peuvent implémenter plusieurs héritages

et peuvent hériter d'une ou plusieurs interfaces. Bien sûr, l'héritage d'interface utilise également le mot-clé extends . Si vous souhaitez plusieurs héritages, utilisez simplement des virgules pour séparer les interfaces héritées. Il convient de noter que lorsque votre interface hérite d'autres interfaces,

hérite directement des attributs de constante statique et des méthodes abstraites de l'interface parent

, donc la classe doit implémenter toutes les abstractions pertinentes lorsque implémentant la méthode d'interface . Vous avez maintenant une certaine compréhension de l'héritage des interfaces PHP. L'exemple suivant est pour référence. Le code est le suivant :

Le résultat de l'exécution du code est le suivant :
<?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("妈妈");  
?>
Copier après la connexion

L'exemple ci-dessus est que l'interface hérite d'une interface, donc lorsque la classe de test implémente l'interface fam, elle doit instancier deux méthodes abstraites, c'est-à-dire instancier à la fois la méthode abstraite de la sous-classe de l'interface et la classe parent.
接口继承,要实现两个抽象方法
平时经常做饭的人是:妈妈

Regardons un exemple d'héritage multiple d'interface. Le code est le suivant :

Exemple de résultats d'exécution :
<?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("妈妈");  
?>
Copier après la connexion

Ce code hérite de deux interfaces Pour. interfaces, toutes les méthodes abstraites de ces trois classes abstraites doivent être instanciées pour toutes les instances. Il y en a trois au total. Après avoir lu ces deux exemples, vous devriez être familier avec l'héritage d'interface. En fait, il existe un héritage simple et un héritage multiple, à condition que toutes les méthodes abstraites pertinentes soient implémentées.
接口继承,要实现两个抽象方法
我的名字是:小强
平时经常做饭的人是:妈妈
 

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Prétraitement de mysqli en PHP préparer

Introduction initiale à la programmation multi-processus PHP

Compréhension du polymorphisme PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal