Maison  >  Article  >  développement back-end  >  Quelle est la méthode magique en php ? Résumé de l'utilisation des méthodes magiques php (code)

Quelle est la méthode magique en php ? Résumé de l'utilisation des méthodes magiques php (code)

不言
不言original
2018-07-24 17:00:335064parcourir

La définition des méthodes magiques en PHP est que les méthodes commençant par deux traits de soulignement __ sont appelées méthodes magiques. Le rôle de ces méthodes magiques en PHP est très important. Jetons un coup d'œil à des exemples de ces méthodes magiques.

Méthodes magiques :

__construct(),类的构造函数
__destruct(),类的析构函数
__call(),在对象中调用一个不可访问方法时调用
__callStatic(),用静态方式中调用一个不可访问方法时调用
__get(),获得一个类的成员变量时调用
__set(),设置一个类的成员变量时调用
__isset(),当对不可访问属性调用isset()或empty()时调用
__unset(),当对不可访问属性调用unset()时被调用。
__sleep(),执行serialize()时,先会调用这个函数
__wakeup(),执行unserialize()时,先会调用这个函数
__toString(),类被当成字符串时的回应方法
__invoke(),调用函数的方式调用一个对象时的回应方法
__set_state(),调用var_export()导出类时,此静态方法会被调用。
__clone(),当对象复制完成时调用

__construct() et __destruct()

Le constructeur et les destructeurs devraient être familier, ils sont appelés lorsque des objets sont créés et détruits. 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);
 }
}
?>

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

<?php
class TmpFileRead extends FileRead
{
 function __construct(){
  parent::__construct();
 }
 
 function __destruct(){
  parent::__destruct();
 }
}
?>

__call() et __callStatic()

Ces deux méthodes sont appelées lorsqu'une méthode inaccessible est appelée dans l'objet, 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).

L'attribut

<?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;);
?>

__get(), __set(),

__get est automatiquement chargé lorsque l'attribut dans l'objet d'accès n'existe pas ou n'est pas un attribut public .__get Méthode, le paramètre n'a qu'une seule valeur de nom, qui est le nom de l'attribut

dans l'objet d'accès.

__set est lors de l'attribution d'une valeur à un attribut dans un objet. Si l'attribut n'existe pas ou est un attribut non public, la méthode __set sera automatiquement chargée. Il y a deux paramètres. Le paramètre 1 est le nom de l'attribut inappelable dans l'objet d'accès. Le paramètre 2 est le paramètre à transmettre pour l'affectation. Il peut s'agir d'un tableau ou d'une chaîne

, les deux ayant un caractère public. visibilité. Non statique, voici un petit exemple pour faciliter la compréhension :

<?php
/**
 * 清晰的认识__get() __set()
 */
class Example {
    
    //公有的属性
    public $public = &#39;pub&#39; ;
    //受保护的 - 子类中该属性可用
    protected $protected = &#39;pro&#39;;
    //私有的 - 只能此类使用此属性
    private $private = &#39;pri&#39;;
    
    //当访问对象中的属性不存在或者非公有属性的时候自动加载__get()方法
    public function __get($name){
        return &#39;调用__get()方法:&#39;.$name;
    }
    
    //当给对象的一个属性赋值的时候如果该属性不存在或者是非公有属性则自动加载__set()方法
    public function __set($name,$value){
        echo "\nname:".$name.&#39;,value:&#39;.$value."\n";
    }
}
$example = new Example;
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
echo $example->public."\n";
echo $example->protected."\n";
echo $example->private."\n";
echo $example->other."\n";
echo &#39;<hr>&#39;;
$example->public = &#39;lic&#39;;   //这个赋值成功所有没有显示
$example->protected = &#39;tec&#39;;
$example->private = &#39;vat&#39;;
$example->other = &#39;er&#39;;
echo &#39;<br/>&#39;;

echo 'Imprimer les attributs publics :'.$example->public;

__isset( ) et __unset()

__isset() Lors de l'appel d'attributs dans un objet ou lors de l'appel d'attributs dans une non-classe à l'aide de la méthode isset(), s'il n'y a pas d'attribut ou s'il n'est pas public

, isset() sera automatiquement exécuté. La méthode

__unset() appelle l'attribut dans l'objet ou appelle l'attribut dans la non-classe. S'il n'y a pas d'attribut ou attribut non public, le unset. () sera automatiquement exécutée. Vous pouvez supprimer les attributs de membre qui ne peuvent pas être appelés. Si vous n'ajoutez pas cette méthode à la classe, vous ne pouvez supprimer aucun membre privé dans l'objet

. > Donnons d'abord un peu de châtaigne :

__sleep() et __wakeup()

Lorsque nous exécutons 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
    /**
     * 针对类中的魔术方法 __isset() 和 __unset() 的例子
     */
class Example {
    public $public;
    protected $protected;
    private $private;
    
    public function __construct(){
        $this->public = &#39;pub&#39;;
        $this->protected = &#39;pro&#39;;
        $this->private = &#39;pri&#39;;
    }
    
    public function __isset($var){
        echo &#39;这里通过__isset()方法查看属性名为 &#39;.$var."\n";
    }
    
    public function __unset($var){
        echo &#39;这里通过__unset()方法要销毁属性名为 &#39;.$var."\n";
    }
}
$exa = new Example;
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
var_dump(isset($exa->public));
echo "\n";
var_dump(isset($exa->protected));
echo "\n";
var_dump(isset($exa->private));
echo "\n";
var_dump(isset($exa->noVar));
echo "\n";
echo &#39;<hr/>&#39;;

unset($exa->public);
var_dump($exa);
echo "\n";
unset($exa->protected);
echo "\n";
unset($exa->private);
echo "\n";
unset($exa->noVar);
echo "\n";


__toString()

<?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();
 }
}
?>

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

Cette méthode ne peut renvoyer qu'une chaîne, et des exceptions ne peuvent pas être levées dans cette méthode, sinon une erreur fatale se produira.

<?php
// Declare a simple class
class TestClass
{
 public function __toString() {
  return &#39;this is a object&#39;;
 }
}
 
$class = new TestClass();
echo $class;
?>
__invoke()

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

__set_state()

<?php
class CallableClass
{
 function __invoke() {
  echo &#39;this is a object&#39;;
 }
}
$obj = new CallableClass;
var_dump(is_callable($obj));
?>

Cette méthode statique sera appelée lorsque var_export() est appelée pour exporter une classe.

__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
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));
?>

Constantes magiques

La plupart des constantes en PHP sont inchangées, mais il y a 8 constantes qui changeront en fonction de l'emplacement du code dans lequel elles se trouvent. sont appelées constantes magiques.
<?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);
 }
}
?>

__LINE__, le numéro de ligne actuel dans le fichier

__FILE__, le chemin complet et le nom du fichier

__DIR__, le répertoire où se trouve le fichier

__FUNCTION__, nom de la fonction

__CLASS__, nom de la classe

__TRAIT__, nom du trait

__METHOD__, nom de la méthode de classe

__NAMESPACE__, nom de l'espace de noms actuel

Ces constantes magiques sont souvent utilisées pour obtenir des informations sur l'environnement actuel ou pour enregistrer des journaux.

Recommandations associées :

Plusieurs méthodes magiques couramment utilisées en PHP

[classes et objets php] méthodes magiques

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!

Déclaration:
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