Maison > Article > développement back-end > Explication détaillée des exemples polymorphes orientés objet en PHP
Cet article partage principalement avec vous une explication détaillée des exemples de polymorphisme orienté objet en PHP. Le polymorphisme fait référence à la possibilité de redéfinir ou de modifier la nature et le comportement d'une classe en fonction du contexte d'utilisation de la classe en mode orienté objet. PHP ne prend pas en charge la surcharge pour obtenir le polymorphisme, mais PHP peut obtenir des effets polymorphes dans différentes directions.
est la suivante :
class a{ function test($i){ // $i可以是任何类型的变量 print_r $i; } }
À partir de l'exemple ci-dessus, on peut voir que puisque PHP est un langage faiblement typé, $i peut être n'importe quel type de variable de cette façon, une fonction peut implémenter des fonctions puissantes telles que Java. Une forme de polymorphisme dans les langages de types qui surcharge les méthodes en modifiant les types de paramètres.
Ce formulaire est plus pratique et efficace que la surcharge de types de paramètres de JAVA, mais il présente également des problèmes, comme suit :
<?php/** 教师类有一个drawPolygon()方法需要一个Polygon类,用来画多边形,此方法内部调用多边形的draw()方法,但由于弱类型,我们可以传入Circle类,就会调用Circle类的draw方法,这就事与愿违了。甚至可以传入阿猫、阿狗类,如果这些类没有draw()方法还会报错。*/class Teacher{ function drawPolygon($polygon){ $polygon->draw(); } }class Polygon{ function draw(){ echo "draw a polygon"; } }class Circle{ function draw(){ echo "draw a circle"; } }?>
On peut voir qu'un tel polymorphisme flexible nécessite un certain contrôle Après. PHP5.3, vous pouvez imposer des restrictions de type sur les paramètres, comme suit :
// 仿java,在变量参数前加一个限制类名 function drawPolygon(Polygon $polygon){ $polygon->draw(); }
Cela restreint uniquement la transmission de Polygon et de ses sous-classes.
Il existe également une surcharge qui modifie le nombre de paramètres. C'est également parce que PHP ne prend pas en charge la surcharge de méthodes, donc certaines méthodes alternatives sont nécessaires pour l'implémenter, comme suit :
<?php// 通过可变参数来达到改变参数数量重载的目的 // 不是必须传入的参数,必须在函数定义时赋初始值function open_database($DB, $cache_size_or_values=null, $cache_size=null) { switch (function_num_args()) // 通过function_num_args()函数计算传入参数的个数,根据个数来判断接下来的操作 { case 1: $r = select_db($DB); break; case 2: $r = select_db($DB, $cache_size_or_values); break; case 3: $r = select_db($DB, $cache_size_or_values, $cache_size); break; } return is_resource($r); }?>
Recommandations associées :
Introduction à l'héritage, au polymorphisme et à l'encapsulation orientés objet PHP
Polymorphisme PHP et liaison dynamique
Un cas d'implémentation d'une méthode de polymorphisme orienté objet en 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!