Maison >développement back-end >tutoriel php >Explication détaillée d'exemples de surcharge et de méthodes magiques en php
Définition : PHP réserve toutes les méthodes de classe commençant par (deux traits de soulignement) comme méthodes magiques. Par conséquent, lors de la définition des méthodes de classe, à l'exception des méthodes magiques ci-dessus, il est recommandé de ne pas préfixer .
Fonction : Les méthodes de modèle peuvent être utilisées pour implémenter facilement la surcharge en PHP orienté objet (La surcharge signifie créer dynamiquement des classes propriétés et méthodes )
En fait, de nombreux blogueurs ont déjà écrit sur ces méthodes... mais je veux quand même le répéter. . Qui vous a demandé de venir écouter ? Ce n’est pas facile de finir de lire autant de mots avant de partir !
1.construct, destruct
constuct est appelé lors de la construction de l'objet ;
destruct est appelé lorsque l'objet est explicitement détruit ou que le script se termine
class Foo { private $name; private $link; public function construct($name) { $this->name = $name; } public function destruct() { echo 'Destroying: ', $this->name, PHP_EOL;//PHP_EOL代表php的换行符 } }Stop, commençons par la définition et l'utilisation de la surcharge :
Définition : "surcharge fournie par PHP >"(surcharge) fait référence à la "création" dynamique de propriétés et de méthodes de classe. (Nous y parvenons grâce à des méthodes magiques)
Fonction : Lors de l'appel d'attributs ou de méthodes de classe non définis ou invisibles dans l'environnement actuel, la méthode surchargée sera appelée. Nous utiliserons plus tard "propriétés inaccessibles" et "méthodes inaccessibles" pour faire référence à ces propriétés ou méthodes de classe non définies ou invisibles.
Remarque : Toutes les méthodes surchargées doivent être déclarées comme publique.
2.get, set, isset, unset, call, callStatic //Pourquoi sont-ils mis ensemble ?
set est appelé lors de l'attribution d'une valeur à un attribut inaccessible ou inexistant
get est appelé lors de la lecture d'un attribut inaccessible ou inexistant
unset est appelé lorsqu'une propriété inaccessible ou inexistante n'est pas définie
callStatic est appelée lors de l'appel d'une méthode statique inaccessible ou inexistante
<?php class PropertyTest { /** 被重载的数据保存在此 */ private $data = array(); /** 重载不能被用在已经定义的属性 */ public $declared = 1; /** 只有从类外部访问这个属性时,重载才会发生 */ private $hidden = 2; public function set($name, $value) { echo "Setting '$name' to '$value'\n"; $this->data[$name] = $value; } public function get($name) { echo "Getting '$name'\n"; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } $trace = debug_backtrace(); trigger_error( 'Undefined property via get(): ' . $name . ' in ' . $trace[0]['file'] . ' on line ' . $trace[0]['line'], E_USER_NOTICE); return null; } /** PHP 5.1.0之后版本 */ public function isset($name) { echo "Is '$name' set?\n"; return isset($this->data[$name]); } /** PHP 5.1.0之后版本 */ public function unset($name) { echo "Unsetting '$name'\n"; unset($this->data[$name]); } /** 非魔术方法 */ public function getHidden() { return $this->hidden; } } echo "<pre class="brush:php;toolbar:false">\n"; $obj = new PropertyTest; $obj->a = 1; echo $obj->a . "\n\n"; var_dump(isset($obj->a)); unset($obj->a); var_dump(isset($obj->a)); echo "\n"; echo $obj->declared . "\n\n"; echo "Let's experiment with the private property named 'hidden':\n"; echo "Privates are visible inside the class, so get() not used...\n"; echo $obj->getHidden() . "\n"; echo "Privates not visible outside of class, so get() is used...\n"; echo $obj->hidden . "\n"; ?>Avez-vous fini de lire ? Beau!
5.sleep, wakeupsleep est appelé lors de l'utilisation de la sérialisation, utile lorsque vous n'avez pas besoin de sauvegarder toutes les données d'un gros objet
<?php class Connection { protected $link; private $server, $username, $password, $db; public function construct($server, $username, $password, $db) { $this->server = $server; $this->username = $username; $this->password = $password; $this->db = $db; $this->connect(); } private function connect() { $this->link = mysql_connect($this->server, $this->username, $this->password); mysql_select_db($this->db, $this->link); } public function sleep() { return array('server', 'username', 'password', 'db'); } public function wakeup() { $this->connect(); } } ?>
7.toString est appelé lorsqu'une classe est convertie en chaîne
<?php class SubObject { static $instances = 0; public $instance; public function construct() { $this->instance = ++self::$instances; } public function clone() { $this->instance = ++self::$instances; } } class MyCloneable { public $object1; public $object2; function clone() { // 强制复制一份this->object, 否则仍然指向同一个对象 $this->object1 = clone $this->object1; } } $obj = new MyCloneable(); $obj->object1 = new SubObject(); $obj->object2 = new SubObject(); $obj2 = clone $obj; print("Original Object:\n"); print_r($obj); print("Cloned Object:\n"); print_r($obj2); ?>
Cette méthode statique est appelée lorsque var_export() est appelée pour exporter une classe. Utilisez la valeur de retour de set_state comme valeur de retour de var_export.
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!