Maison > développement back-end > tutoriel php > Introduction aux méthodes magiques php

Introduction aux méthodes magiques php

WJ
Libérer: 2023-04-08 18:52:01
avant
2425 Les gens l'ont consulté

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 [, $... ]] )
Copier après la connexion

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

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

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

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 )
Copier après la connexion
<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __set($name,$value){
        echo "0{$name}0{$value}<br>";
    }
}
Copier après la connexion

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 )
Copier après la connexion
<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __isset($name){
        echo "0{$name}0<br>";
    }
}
Copier après la connexion

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

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

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

public $foo; __construct($foo)
{
$this-> ;foo = $foo;
} fonction publique __toString() {
return $this->foo;
}
}$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 &#39;$name&#39; "
             . implode(&#39;, &#39;, $arguments). "
";
    }    public static function __callStatic($name, $arguments) 
    {
        echo "Calling static method &#39;$name&#39; "
             . implode(&#39;, &#39;, $arguments). "
";
    }
}
Copier après la connexion

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 . &#39;.php&#39;;
}
Copier après la connexion

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(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
    }    public function __wakeup()
    {
        $this->connect();
    }
}?>
Copier après la connexion

函数调用

invoke()
Copier après la connexion

  当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用

<?phpclass CallableClass {
    function __invoke($x) {
        var_dump($x);
    }
}
Copier après la connexion

【补充】

set_state()

  当调用var_export()导出类时,set_state()方法会被调用,本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性

  [注意]var_export()返回关于传递给该函数的变量的结构信息,它和var_dump()类似,不同的是其返回的表示是合法的PHP代码,也就是说,var_export返回的代码,可以直接当作php代码赋给一个变量。 而这个变量就会取得和被var_export一样的类型的值

public $var1; public $var2; public static function __set_state($an_array)
{
$obj = new A; $obj->var1 = $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!

Étiquettes associées:
php
source:51dev.com
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