Explication détaillée de la comparaison de la méthode magique php et utilisation d'un exemple de code

伊谢尔伦
Libérer: 2023-03-14 09:26:01
original
1398 Les gens l'ont consulté

En PHP, les méthodes commençant par deux traits de soulignement sont appelées méthodes magiques. Ces méthodes jouent un rôle déterminant en PHP.

construct() et destruct()

Constructeur et destructeur devraient être familiers, ils sont utilisés dans la création d'objets et la destruction est appelé quand. Par exemple, nous devons ouvrir un fichier, l'ouvrir lorsque l'objet est créé et le fermer lorsque l'objet meurt

<?php 
class FileRead
{
 protected $handle = NULL;

 function construct(){
  $this->handle = fopen(...);
 }

 function destruct(){
  fclose($this->handle);
 }
}
?>
Copier après la connexion

Ces deux méthodes peuvent être développées en cas d'héritage, par exemple :

.
<?php 
class TmpFileRead extends FileRead
{
 function construct(){
  parent::construct();
 }

 function destruct(){
  parent::destruct();
 }
}
?>
Copier après la connexion

call() et callStatic()

Ces deux méthodes sont appelées lorsqu'une méthode inaccessible est appelée dans l'objet, et cette dernière est une méthode statique. Ces deux méthodes peuvent être utilisées dans les appels de méthodes variables (fonctions variables).

<?php
class MethodTest 
{
 public function call ($name, $arguments) {
  echo "Calling object method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }

 public static function callStatic ($name, $arguments) {
  echo "Calling static method &#39;$name&#39; ". implode(&#39;, &#39;, $arguments). "\n";
 }
}

$obj = new MethodTest;
$obj->runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);
?>
Copier après la connexion

get(), set(), isset() et unset()

Ces deux sont appelés lors de l'obtention/définition d'une variable membre d'une classe fonction. Par exemple, nous enregistrons les variables de l'objet dans un autre tableau au lieu des variables membres de l'objet lui-même

<?php 
class MethodTest
{
 private $data = array();

 public function set($name, $value){
  $this->data[$name] = $value;
 }

 public function get($name){
  if(array_key_exists($name, $this->data))
   return $this->data[$name];
  return NULL;
 }

 public function isset($name){
  return isset($this->data[$name])
 }

 public function unset($name){
  unset($this->data[$name]);
 }
}
?>
Copier après la connexion

sleep() et wakeup()

Quand nous sont dans Lors de l'exécution de serialize() et unserialize(), ces deux fonctions seront appelées en premier. Par exemple, lorsque nous sérialisons un objet, l'objet possède un lien de base de données. Si nous souhaitons restaurer l'état du lien lors de la désérialisation, nous pouvons restaurer le lien en reconstruisant ces deux fonctions. Un exemple est le suivant :

<?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(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
 }

 public function wakeup()
 {
  $this->connect();
 }
}
?>
Copier après la connexion

toString()

La méthode de réponse lorsque l'objet est traité comme une chaîne. Par exemple, utilisez echo $obj; pour générer un objet

<?php
// Declare a simple class
class TestClass
{
 public function toString() {
  return &#39;this is a object&#39;;
 }
}

$class = new TestClass();
echo $class;
?>
Copier après la connexion

Cette méthode ne peut renvoyer qu'une chaîne, et vous ne pouvez pas lancer une exception dans cette méthode, sinon une erreur fatale. se produira.

invoke()

La méthode de réponse lors de l'appel d'un objet en appelant une fonction. Comme suit

<?php
class CallableClass 
{
 function invoke() {
  echo &#39;this is a object&#39;;
 }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>
Copier après la connexion

set_state()

Lors de l'appel de var_export() pour exporter une classe, cette méthode statique sera appelée.

<?php
class A
{
 public $var1;
 public $var2;

 public static function set_state ($an_array) {
  $obj = new A;
  $obj->var1 = $an_array[&#39;var1&#39;];
  $obj->var2 = $an_array[&#39;var2&#39;];
  return $obj;
 }
}

$a = new A;
$a->var1 = 5;
$a->var2 = &#39;foo&#39;;
var_dump(var_export($a));
?>
Copier après la connexion

clone()

Appelé lorsque la copie de l'objet est terminée. Par exemple, dans la méthode d'implémentation en mode singleton mentionnée dans l'article Explication détaillée des modèles de conception et implémentation PHP : mode Singleton, cette fonction est utilisée pour empêcher le clonage d'objets.

<?php 
public class Singleton {
 private static $_instance = NULL;

 // 私有构造方法 
 private function construct() {}

 public static function getInstance() {
  if (is_null(self::$_instance)) {
   self::$_instance = new Singleton();
  }
  return self::$_instance;
 }

 // 防止克隆实例
 public function clone(){
  die(&#39;Clone is not allowed.&#39; . E_USER_ERROR);
 }
}
?>
Copier après la connexion

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!