Maison >développement back-end >tutoriel php >Introduction aux méthodes magiques php
Comme mentionné précédemment
PHP a de nombreuses méthodes magiques associées dans la partie orientée objet. Ces méthodes facilitent l'implémentation orientée objet. méthodes en détail
Méthode constructeur
La plupart des classes ont une méthode spéciale appelée constructeur. Lorsqu'un objet est créé, il appellera automatiquement le constructeur, qui est généralement utilisé pour effectuer certaines tâches d'initialisation utiles
La déclaration du constructeur est la même que la déclaration des autres opérations, sauf que son nom doit être deux traits de soulignement __construct( ). Il s'agit d'un changement dans PHP5 ; dans la version PHP4, le nom du constructeur doit être le même que le nom de la classe. Pour des raisons de compatibilité ascendante, s'il n'y a pas de méthode nommée __construct() dans une classe, PHP recherchera une méthode du même nom que la classe
void __construct ([ mixed $args [, $... ]] )
Si le constructeur est défini dans la sous-classe, il ne le sera pas appelé implicitement Le constructeur de sa classe parent. Pour exécuter le constructeur de la classe parent, vous devez appeler parent::__construct()
dans le constructeur de la classe enfant. Si la sous-classe ne définit pas de constructeur, elle sera héritée de la classe parent comme une méthode de classe ordinaire (si elle n'est pas définie comme privée)
<?phpclass BaseClass { function __construct() { print "In BaseClass constructor "; } }class SubClass extends BaseClass { function __construct() { parent::__construct(); print "In SubClass constructor "; } }
Méthode destructeur
L'opposé de la méthode de construction est la méthode de destruction. La méthode destructeur est un contenu nouvellement ajouté à PHP5. Il n'y a pas de méthode destructeur dans PHP4. La méthode destructeur est une méthode qui est automatiquement appelée avant la destruction de l'objet. Elle effectue principalement certaines opérations spécifiques, telles que la fermeture de fichiers, la publication d'ensembles de résultats, etc.
Semblable à la méthode constructeur, le nom de la méthode destructeur. d'une classe doit être deux underscore__destruct(). Le destructeur ne peut prendre aucun paramètre
<?phpclass MyDestructableClass { function __construct() { print "In constructor "; $this->name = "MyDestructableClass"; } function __destruct() { print "Destroying " . $this->name . " "; } }//In constructor Destroying MyDestructableClass$obj = new MyDestructableClass();?>
Propriétés inaccessibles
get()
Lors de la lecture de propriétés inaccessibles (protégées, privées), __get() le fera être appelé, et le nom de l'attribut sera transmis à cette méthode comme premier paramètre (chaîne)
public mixed __get ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __get($name){ echo "111{$name}111<br>"; } }$d1 = new demo;$d1->protected;//111protected111$d1->public;$d1->private;//111private111?>
set()
Lors de l'attribution une valeur pour un attribut inaccessible (protégé, privé), __set() sera appelé, et le nom de l'attribut sera passé dans cette méthode comme premier paramètre (chaîne) et la valeur comme deuxième paramètre (mixte)
public void __set ( string $name , mixed $value )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __set($name,$value){ echo "0{$name}0{$value}<br>"; } }
isset()
Lorsque isset() ou empty() est appelé sur des propriétés inaccessibles (protégées, privées), __isset() sera appelé
public bool __isset ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __isset($name){ echo "0{$name}0<br>"; } }
unset()
Lorsque unset() est appelé sur des propriétés inaccessibles (protected, private), __unset() sera appelé
public void __unset ( string $name )
<?phpclass demo{ protected $protected = 1; public $public = 2; private $private = 3; function __unset($name){ echo "0{$name}0<br>"; } }
Copie d'objet
clone()
La méthode clone() est automatiquement appelée lorsque l'objet est cloné. Cette méthode ne nécessite aucun paramètre. Vous pouvez utiliser cette méthode pour The. la copie clonée est réinitialisée
La méthode clone() inclura automatiquement des références aux deux objets ceci et cela. Ceci est une référence à l'objet copie, et cela est une référence à l'objet original
.<?php class Person{ private $name; private $sex; private $age; function __construct($name="",$sex="",$age=1){ $this->name= $name; $this->sex = $sex; $this->age = $age; } function __clone(){ $this->name = $this->name."的副本"; } function say(){ echo "我的名字:" .$this->name.",性别:".$this->sex.",年龄:".$this->age."<br>"; } }
String
toString()
La méthode __toString() est utilisée pour déterminer comment une classe doit répondre lorsqu'elle est traitée comme une chaîne. le moyen le plus pratique d'obtenir rapidement la représentation sous forme de chaîne d'un objet. La méthode est une méthode qui est automatiquement appelée lors de la sortie directe d'une référence d'objet
2fb8b9e88caf4e0a09a1e3bf52309617foo;
}
}$class = new TestClass('Bonjour');echo $class; //Bonjour?>
L'objet n'existe pas
call()
Lors de l'appel d'une méthode inaccessible dans l'objet, __call () sera appelé
callStatic()
Lors de l'appel d'une méthode inaccessible dans un contexte statique, __callStatic() sera appelé
<?phpclass MethodTest { public function __call($name, $arguments) { echo "Calling object method '$name' " . implode(', ', $arguments). " "; } public static function __callStatic($name, $arguments) { echo "Calling static method '$name' " . implode(', ', $arguments). " "; } }
Classes de chargement automatique
autoload()
En PHP5, vous pouvez définir une fonction __autoload(), qui sera automatiquement appelée lorsque vous essayez d'utiliser une classe qui n'a pas encore été définie. En appelant cette fonction, le moteur de script a une dernière chance de charger les classes requises avant que PHP échoue avec une erreur
<?phpfunction __autoload($class_name) { require_once $class_name . '.php'; }
Serialize
sleep()
在调用serialize()函数将对象串行化时,检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误
__sleep()函数不需要接受任何参数,但需要返回一个数组,在数组中包含需要串行化的属性。未被包含在数组中的属性将在串行化时被忽略。如果没有在类中声明__sleep()方法,对象中的所有属性都将被串行化
wakeup()
在调用unserialize()函数将对象反串行化对象时,则会自动调用对象中的__wakeup()方法,用来在二进制串重新组成一个对象时,为新对象中的成员属性重新初始化
wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作
<?phpclass 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(); } }?>
函数调用
invoke()
当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用
<?phpclass CallableClass { function __invoke($x) { var_dump($x); } }
【补充】
set_state()
当调用var_export()导出类时,set_state()方法会被调用,本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性
[注意]var_export()返回关于传递给该函数的变量的结构信息,它和var_dump()类似,不同的是其返回的表示是合法的PHP代码,也就是说,var_export返回的代码,可以直接当作php代码赋给一个变量。 而这个变量就会取得和被var_export一样的类型的值
8c94170b7cb538fd32c57939f0221304var1 = $an_array['var1']; $obj->var2 = $an_array['var2']; return $obj;
}
}
相关参考: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!