Explication détaillée de la surcharge en PHP

小云云
Libérer: 2023-03-22 20:20:01
original
3157 Les gens l'ont consulté

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);
 ?>
Copier après la connexion

À 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 :

Surcharge d'attributs

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);
Copier après la connexion

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;
}
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion


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;
Copier après la connexion


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.

Méthodes surchargées

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();//当调用本不存在的方法时。
Copier après la connexion

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();//当调用本不存在的方法时。
Copier après la connexion

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!

É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