Maison >développement back-end >tutoriel php >Explication détaillée de la surcharge en PHP
La surcharge en PHP est différente des autres langages orientés objet (C#, Java). Par exemple, la surcharge en C# a le même nom de méthode, mais des listes de paramètres formels différentes (c'est-à-dire le nombre de paramètres formels, un type différent). et arrangement) la fonction déterminera la méthode à appeler en fonction de la liste de paramètres formels lors de l'appel.
La surcharge en PHP est destinée au traitement des membres inaccessibles de l'objet courant (non définis ou définis mais inaccessibles) :
<?php Class Student{ private $_age; } $o1=new Student(); $o1->_name="Li"; var_dump($o1); echo "<br/>"; $o1->_age=24; var_dump($o1); ?>
À partir de ce résultat, nous pouvons voir que lors de l'accès au membre inexistant $_name, le membre sera placé dans l'objet en tant qu'attribut partagé. En ce qui concerne les problèmes d’autorisation d’accès, une erreur sera signalée.
Pour cette situation, il existe des méthodes magiques pour la surcharge d'attributs en php :
1.__set($name,$value) : lors de l'appel lorsqu'un l'attribut est inaccessible (n'existe pas/l'accès est restreint), le système appellera automatiquement la fonction __set() dans la classe correspondante. $name représente le nom de l'attribut appelé et $value représente la valeur transmise lors de l'opération.
Si l'attribut n'existe pas :
<?php Class Student{ private $_age; function __set($name,$value){ } } $o1=new Student(); $o1->_name="Li"; var_dump($o1);
Ici, lorsque nous apportons quelques modifications à l'exemple ci-dessus : Ajoutez une méthode __set() à la classe Student Lorsque le code $o1->_name="Li"; est exécuté, la méthode __set() sera automatiquement appelée. Comme il ne contient aucun code, il est impossible d'obtenir la même affectation que la situation par défaut, il n'y a donc qu'une seule propriété privée $_age dans l'objet $o1 affiché ;
Vous pouvez également écrire ce code dans la méthode __set() :
function __set($name,$value){ $this->$name=$value; }
Le résultat à ce moment est
Si l'attribut existe, mais il est inaccessible :
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age; function __set($name,$value){ //进入该函数表示$name 这个属性不可访问。 if(property_exists($this,$name)){ //property_exists()函数判断当前对象($this)中是否存在$name属性。 trigger_error("属性不可访问!",E_USER_ERROR); }else{ } } } $o1=new Student(); $o1->_age=2; var_dump($o1);
2.__get() : Sera déclenché lors de l'accès à un membre inaccessible :
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age=23; function __get($name){ //进入该函数表示$name 这个属性不可访问。 return $this->$name; } } $o1=new Student(); echo $o1->_age; echo "<br/>"; var_dump($o1);
3.__unset() : Cette fonction est déclenchée lorsqu'une variable est supprimée.
Son scénario d'application spécifique : Nous connaissons tous la fonction unset(), qui supprime une certaine variable. Elle peut également être utilisée dans les objets. Par exemple, dans notre exemple ci-dessus, si $_age est public, alors vous. peut utiliser unset($o1->_age); Cependant, $_age est ici un attribut privé, auquel il n'est pas possible d'accéder en utilisant unset() pour le moment.
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age=23; } $o1=new Student(); unset($o1->_age);
Cela nécessite la méthode magique __unset() pour implémenter la suppression d'attribut dans la classe :
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ private $_age=23; function __get($name){ return $this->$name;//正常应该有判断语句,这里省略了。 } function __unset($name){ unset($this->$name); } } $o1=new Student(); echo $o1->_age; unset($o1->_age); echo $o1->_age;
L'application spécifique est similaire aux __set() et __get() ci-dessus, c'est-à-dire que lorsque vous désactivez (nom de la variable) ;, la méthode __unset() sera automatiquement appelée et le corps de la méthode pouvez le définir vous-même.
4.__isset() : Principalement utilisé pour déterminer si des attributs existent, de la même manière que __unset(). Lorsque l'extérieur veut déterminer s'il existe un attribut, la variable privée n'est pas accessible à l'aide de la fonction isset(). Dans ce cas, la méthode __isset() peut être utilisée pour la définir.
Les conditions de surcharge de méthode et de surcharge d'attribut sont les mêmes : lors de l'appel d'une méthode qui n'existe pas ou qui est inaccessible, les méthodes __call() et Static__callStatic() seront appelées .
Appeler une méthode qui n'existe pas par défaut dans le système :
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ public static $a=1; private $_age=23; } $o1=new Student(); $o1->getName();//当调用本不存在的方法时。
Une erreur grave se produira dans le système.
__call() : La méthode magique utilisée lors de l'appel avec un objet
<?php header("Content-Type:text/html;charset=utf-8"); Class Student{ public static $a=1; private $_age=23; function __call($name,$arr){ //$name表示传入的方法名,$arr表示传入的方法列表(是一个数组)。 trigger_error("不存在该函数",E_USER_NOTICE);//直接报错 //也可以在此重写函数。 } } $o1=new Student(); $o1->getName();//当调用本不存在的方法时。
Static__callStatic() : Utilisation d'une méthode d'appel de classe, c'est-à-dire appeler un objet qui ne l'est pas. Cette méthode magique peut être utilisée lorsqu'une méthode statique existe.
Recommandations associées :
Introduction à la surcharge en PHP
Explication détaillée de la surcharge de fonctions en JavaScript
Exemples détaillés de surcharge et de méthodes magiques 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!