Table des matières
1.__construct()
__destruct()
析构函数的声明
析构函数的使用
__call()
使用
4. __callStatic()
__get()
6. __set()
7. __isset()
8. __unset()
9. __sleep()
10. __wakeup()
11. __toString()
Déclaration du destructeur
Utilisation du destructeur
Utiliser
12. __invoke()
13.__set_state()
14. __clone()
15.__autoload()
16. __debugInfo()
总结
Maison développement back-end tutoriel php Vous présente 16 méthodes magiques PHP

Vous présente 16 méthodes magiques PHP

May 16, 2022 pm 08:45 PM
php 魔术方法

Quelle est la méthode magique ? Cet article vous présentera 16 méthodes magiques que les développeurs PHP doivent connaître. J'espère que cela vous sera utile !

Vous présente 16 méthodes magiques PHP

En PHP, les méthodes nommées commençant par un double trait de soulignement (__) sont appelées méthodes magiques en PHP, et elles jouent un rôle très important en PHP. Les méthodes magiques incluent :

Nom de la méthode Description
__construct() Constructeur de classe
__destruct() Destructeur de classe
__appel($ funName, $ arguments) Lorsqu'une méthode non définie ou inaccessible est appelée, la méthode __call() sera appelée.
__callStatic($funName, $arguments) Lorsqu'une méthode statique non définie ou inaccessible est appelée, la méthode __callStatic() sera appelée.
__get($propertyName) Lors de l'obtention d'une variable membre d'une classe, la méthode __get() sera appelée.
__set($property, $value) Lors de l'attribution d'une variable membre d'une classe, la méthode __set() sera appelée.
__isset($content) Lorsque vous appelez isset() ou empty() pour attribuer une valeur à un membre indéfini ou inaccessible, la méthode __isset() sera appelée.
__unset($content) Lors de l'appel de reset() pour mettre à jour un membre non défini ou inaccessible, la méthode __unset() sera appelée.
__sleep() Lorsque Serialize() est exécuté, la méthode __sleep() sera appelée en premier.
__wakeup() Lorsque la désérialisation() est effectuée, la méthode __wakeup() sera appelée en premier.
__toString() Lorsque vous utilisez la méthode echo pour afficher directement l'objet d'affichage, la méthode __toString() est appelée en premier.
__invoke() Lors de l'accès à un objet à l'aide d'une fonction, la méthode __invoke() sera appelée en premier.
__set_state($an_array) Lorsque la méthode var_export() est appelée, la méthode __set_state() sera appelée.
__clone() Lorsque l'objet est copié et attribué, la méthode __clone() sera appelée.
__autoload($className) Appelé lors de la tentative de chargement d'une classe non définie.
__debugInfo() Informations de débogage de sortie.

Cet article utilisera quelques exemples pour démontrer l'utilisation des méthodes magiques PHP.

1.__construct()

Lors de la création d'un objet, la méthode constructeur de la classe PHP est la première méthode à être appelée. Chaque classe possède des méthodes constructeur. Si vous ne le définissez pas explicitement dans la classe, il y aura un constructeur de classe par défaut sans argument, bien qu'il ne soit pas défini dans la classe.

1) Application de la méthode constructeur

La méthode constructeur d'une classe est généralement utilisée pour effectuer certaines tâches d'initialisation, telles que l'initialisation et l'attribution de valeurs aux membres lors de la création d'un objet.

2) Format de déclaration des méthodes constructeur dans les classes

function __constrct([parameter list]){

    方法具体实现 //通常为成员变量初始赋值。

}
Copier après la connexion

Remarque : Un seul constructeur peut être déclaré dans la plupart des classes. Parce que PHP ne prend pas en charge la surcharge des constructeurs.

Voici un exemple complet :

<?php
    class Person
    {                                                                     
            public $name;       
            public $age;       
            public $sex;       

        /**
         * 明确定义含参的构造方法
         */                                                                                       
        public function __construct($name="", $sex="Male", $age=22)
        {     
            $this->name = $name;
            $this->sex = $sex;
            $this->age = $age;
        }

        /**
         * say 方法定义
         */
        public function say()
        {
            echo "Name:" . $this->name . ",Sex:" . $this->sex . ",Age:" . $this->age;
        }   

    }
Copier après la connexion

Créez un objet $Person1 sans paramètres.

$Person1 = new Person();
echo $Person1->say(); //显示:Name:,Sex:Male,Age:22
Copier après la connexion

Appelez avec un paramètre "Jams" pour créer un objet $Person2.

$Person2 = new Person("Jams");
echo $Person2->say(); // 显示: Name: Jams, Sex: Male, Age: 22
Copier après la connexion

Appelé avec 3 paramètres pour créer un objet $Person3.

$Person3 = new Person ("Jack", "Male", 25);
echo $Person3->say(); // 显示:Name: Jack, Sex: Male, Age: 25
Copier après la connexion

__destruct()

Destructor est l'opposé du constructeur.

Destructor vous permet d'effectuer certaines opérations avant de détruire l'objet, comme fermer le fichier, effacer l'ensemble de résultats, etc.

Destructor est une nouvelle fonctionnalité introduite dans PHP 5.

La déclaration du destructeur est similaire au constructeur, commençant par deux traits de soulignement, et le nom est fixé à __destruct(). __destruct()

析构函数的声明

function __destruct()
{
    //method body
}
Copier après la connexion

析构函数不能带参数。

析构函数的使用

析构函数在类中一般不常见。它是类的可选部分,通常用于在类销毁之前完成一些清理任务。

这是使用析构函数的示例:

<?php
class Person{     

    public $name;         
    public $age;         
    public $sex;         

    public function __construct($name="", $sex="Male", $age=22)
    {   
        $this->name = $name;
        $this->sex  = $sex;
        $this->age  = $age;
    }

    /**
     * say method
     */
    public function say()
    {
        echo "Name:".$this->name.",Sex:".$this->sex.",Age:".$this->age;
    }   

    /**
     * declare a destructor method
     */
    public function __destruct()
    {
            echo "Well, my name is ".$this->name;
    }
}

$Person = new Person("John");
unset($Person); //destroy the object of $Person created above
Copier après la connexion

输出结果

Well, my name is John
Copier après la connexion

__call()

该方法接受两个参数。第一个参数为未定义的方法名称,第二个参数则为传入方法的参数构成的数组

使用

function __call(string $function_name, array $arguments)
{
    // method body
}
Copier après la connexion

在程序中调用未定义方法时, __call() 方法将被调用。

示例

<?php
class Person
{                             
    function say()
    {
           echo "Hello, world!<br>";
    }     

    function __call($funName, $arguments)
    {
          echo "The function you called:" . $funName . "(parameter:" ;  // Print the method's name that is not existed.
          print_r($arguments); // Print the parameter list of the method that is not existed.
          echo ")does not exist!!<br>\n";                   
    }                                         
}
$Person = new Person();           
$Person->run("teacher"); // If the method which is not existed is called within the object, then the __call() method will be called automatically.
$Person->eat("John", "apple");             
$Person->say();
Copier après la connexion

显示结果

The function you called: run (parameter: Array([0] => teacher)) does not exist!
The function you called: eat (parameter: Array([0] => John[1] => apple)) does not exist!
Hello world!
Copier après la connexion

4. __callStatic()

当在程序中调用未定义的静态方法,__callStatic() 方法将会被自动调用。

__callStatic() 的用法类似于 __call() 。下面举个例子:

<?php
class Person
{
    function say()
    {
        echo "Hello, world!<br>";
    }

    public static function __callStatic($funName, $arguments)
    {
        echo "The static method you called:" . $funName . "(parameter:" ;  // 打印出未定义的方法名。
        print_r($arguments); // 打印出未定义方法的参数列表。
        echo ")does not exist!<br>\n";
    }
}
$Person = new Person();
$Person::run("teacher"); // 如果此项目内不存在的方法被调用了,那么 __callStatic() 方法将被自动调用。
$Person::eat("John", "apple");
$Person->say();
Copier après la connexion

执行结果如下:

The static method you called: run (parameter: Array([0] => teacher)) does not exist!
The static method you called: eat (parameter: Array([0] => John[1] => apple)) does not exist!
Hello world!
Copier après la connexion

__get()

当你尝试在外部访问对象的私有属性时,应用程序将抛出异常并结束运行。我们可以使用 __get 方法解决该问题。该方法可以获取从对象外部获取私有属性的值。举例如下

<?php
class Person
{
    private $name;
    private $age;

    function __construct($name="", $age=1)
    {
        $this->name = $name;
        $this->age = $age;
    }

    public function __get($propertyName)
    {   
        if ($propertyName == "age") {
            if ($this->age > 30) {
                return $this->age - 10;
            } else {
                return $this->$propertyName;
            }
        } else {
            return $this->$propertyName;
        }
    }
}
$Person = new Person("John", 60);   // Instantiate the object with the Person class and assign initial values to the properties with the constructor.
echo "Name:" . $Person->name . "<br>";   // When the private property is accessed, the __get() method will be called automatically,so we can get the property value indirectly.
echo "Age:" . $Person->age . "<br>";    // The __get() method is called automatically,and it returns different values according to the object itself.
Copier après la connexion

结果显示如下

Name: John
Age: 50
Copier après la connexion

6. __set()

set($property,$value)方法用于设置类的私有属性。分配了未定义的属性后,将触发set()方法,并且传递的参数是设置的属性名称和值。

下面是演示代码:

<?php
class Person
{
    private $name;
    private $age;

    public function __construct($name="",  $age=25)
    {
        $this->name = $name;
        $this->age  = $age;
    }

    public function __set($property, $value) {
        if ($property=="age")
        {
            if ($value > 150 || $value < 0) {
                return;
            }
        }
        $this->$property = $value;
    }

    public function say(){
        echo "My name is ".$this->name.",I'm ".$this->age." years old";
    }
}

$Person=new Person("John", 25); //请注意,类初始化并为“name”和“age”分配初始值。
$Person->name = "Lili";     // "name" 属性值被成功修改。如果没有__set()方法,程序将报错。
$Person->age = 16; // "age"属性修改成功。
$Person->age = 160; //160是无效值,因此修改失败。
$Person->say();  //输出:My name is Lili, I'm 16 years old。
Copier après la connexion

代码运行结果:

My name is Lili, I'm 16 years old
Copier après la connexion

7. __isset()

在使用__isset()方法之前,让我先解释一下isset()方法的用法。isset()方法主要用于确定是否设置了此变量。

如果在对象外部使用isset()方法,则有两种情况:

  1. 如果该参数是公共属性,则可以使用isset()方法确定是否设置了该属性。
  2. 如果参数是私有属性,则isset()方法将不起作用。

那么对于私有属性,有什么办法知道它是否被设置了吗?当然,只要在类中定义__isset()方法,就可以在类外部使用isset()方法来确定是否设置了私有属性。

当在未定义或不可访问的属性上调用isset()或empty()时,将调用__isset()方法。下面是一个例子:

<?php
class Person
{
    public $sex;
    private $name;
    private $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    /**
     * @param $content
     *
     * @return bool
     */
    public function __isset($content) {
        echo "The {$content} property is private,the __isset() method is called automatically.<br>";
        echo  isset($this->$content);
    }
}

$person = new Person("John", 25); // Initially assigned.
echo isset($person->sex),"<br>";
echo isset($person->name),"<br>";
echo isset($person->age),"<br>";
Copier après la connexion

代码运行结果如下:

1
The name property is private,the __isset() method is called automatically.
1
The age property is private,the __isset() method is called automatically.
1
Copier après la connexion

8. __unset()

isset()方法类似,当在未定义或不可访问的属性上调用unset()方法时,将调用unset()方法。下面是一个例子:

<?php
class Person
{
    public $sex;
    private $name;
    private $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    /**
     * @param $content
     *
     * @return bool
     */
    public function __unset($content) {
        echo "It is called automatically when we use the unset() method outside the class.<br>";
        echo  isset($this->$content);
    }
}

$person = new Person("John", 25); // Initially assigned.
unset($person->sex),"<br>";
unset($person->name),"<br>";
unset($person->age),"<br>";
Copier après la connexion

代码的运行结果如下:

It is called automatically when we use the unset() method outside the class.
1
It is called automatically when we use the unset() method outside the class.
1
Copier après la connexion

9. __sleep()

serialize()方法将检查类中是否有魔术方法__sleep()。如果存在,将首先调用该方法,然后执行序列化操作。

__sleep()方法通常用于指定保存数据之前需要序列化的属性。如果有一些非常大的对象不需要全部保存,那么您会发现此功能非常有用。

有关详细信息,请参考以下代码:

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    /**
     * @return array
     */
    public function __sleep() {
        echo "It is called when the serialize() method is called outside the class.<br>";
        $this->name = base64_encode($this->name);
        return array('name', 'age'); // It must return a value of which the elements are the name of the properties returned.
    }
}

$person = new Person('John'); // Initially assigned.
echo serialize($person);
echo '<br/>';
Copier après la connexion

代码运行结果如下:

It is called when the serialize() method is called outside the class.
O:6:"Person":2:{s:4:"name";s:8:"5bCP5piO";s:3:"age";i:25;}
Copier après la connexion

10. __wakeup()

sleep()方法相比,wakeup()方法通常用于反序列化操作,例如重建数据库连接或执行其他初始化操作。

下面是相关实例:

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    /**
     * @return array
     */
    public function __sleep() {
        echo "It is called when the serialize() method is called outside the class.<br>";
        $this->name = base64_encode($this->name);
        return array('name', 'age'); // It must return a value of which the elements are the name of the properties returned.
    }

    /**
     * __wakeup
     */
    public function __wakeup() {
        echo "It is called when the unserialize() method is called outside the class.<br>";
        $this->name = 2;
        $this->sex = 'Male';
        // There is no need to return an array here.
    }
}

$person = new Person('John'); // Initially assigned.
var_dump(serialize($person));
var_dump(unserialize(serialize($person)));
Copier après la connexion

代码运行结果如下:

It is called when the serialize() method is called outside the class.
string(58) "O:6:"Person":2:{s:4:"name";s:8:"5bCP5piO";s:3:"age";i:25;}"
It is called when the unserialize() method is called outside the class.
object(Person)#2 (3) { ["sex"]=> string(3) "Male" ["name"]=> int(2) ["age"]=> int(25) }
Copier après la connexion

11. __toString()

使用echo方法直接打印对象时,将调用__toString()方法。

注意:此方法必须返回一个字符串,否则将在E_RECOVERABLE_ERROR

Déclaration du destructeur

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    public function __toString()
    {
        return  'go go go';
    }
}

$person = new Person('John'); // Initially assigned.
echo $person;
Copier après la connexion

Le destructeur ne peut pas prendre de paramètres.

Utilisation du destructeur

Le destructeur n'est généralement pas courant dans les classes. Il s'agit d'une partie facultative de la classe et est généralement utilisée pour effectuer certaines tâches de nettoyage avant que la classe ne soit détruite.

Voici un exemple d'utilisation d'un destructeur :

go go go
Copier après la connexion
Output result🎜
<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

}

$person = new Person('John'); // Initially assigned.
echo $person;
Copier après la connexion
🎜__call()🎜🎜Cette méthode accepte deux paramètres. Le premier paramètre est le nom de la méthode non définie et le deuxième paramètre est un tableau de paramètres transmis à la méthode🎜

Utiliser

Catchable fatal error: Object of class Person could not be converted to string in D:\phpStudy\WWW\test\index.php on line 18
Copier après la connexion
Copier après la connexion
🎜Lors de l'appel d'une méthode non définie dans un programme, __call( ) sera appelée. 🎜🎜Exemple🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php class Person { public $sex; public $name; public $age; public function __construct($name=&quot;&quot;, $age=25, $sex=&amp;#39;Male&amp;#39;) { $this-&gt;name = $name;         $this-&gt;age  = $age;         $this-&gt;sex  = $sex;     }     public function __invoke() {         echo 'This is an object';     } } $person = new Person('John'); // Initially assigned. $person();</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div>🎜Afficher les résultats🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">This is an object</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div>🎜4. __callStatic()🎜🎜Lorsqu'une méthode statique non définie est appelée dans le programme, la méthode <code>__callStatic() sera automatiquement appelée. 🎜🎜__callStatic() est utilisé de manière similaire à __call() . Voici un exemple : 🎜
Fatal error: Function name must be a string in D:\phpStudy\WWW\test\index.php on line 18
Copier après la connexion
Copier après la connexion
🎜Le résultat de l'exécution est le suivant : 🎜
<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

}

$person = new Person('John'); // Initially assigned.
var_export($person);
Copier après la connexion
Copier après la connexion
🎜__get()🎜🎜Lorsque vous essayez d'accéder aux propriétés privées de l'objet en externe, l'application lèvera une exception et mettra fin à l'opération. Nous pouvons résoudre ce problème en utilisant la méthode __get. Cette méthode permet d’obtenir la valeur d’une propriété privée depuis l’extérieur de l’objet. Un exemple est le suivant🎜
Person::__set_state(array( 'sex' => 'Male', 'name' => 'John', 'age' => 25, ))
Copier après la connexion
Copier après la connexion
🎜Le résultat est affiché comme suit🎜
<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    public static function __set_state($an_array)
    {
        $a = new Person();
        $a->name = $an_array['name'];
        return $a;
    }

}

$person = new Person('John'); // Initially assigned.
$person->name = 'Jams';
var_export($person);
Copier après la connexion
Copier après la connexion
🎜6. La méthode __set()🎜🎜set($property,$value) est utilisée pour définir les propriétés privées de la classe. Lorsqu'une propriété non définie est affectée, la méthode set() est déclenchée et les paramètres transmis sont le nom et la valeur de la propriété définie. 🎜🎜Ce qui suit est le code de démonstration :🎜
Person::__set_state(array( 'sex' => 'Male', 'name' => 'Jams', 'age' => 25, ))
Copier après la connexion
Copier après la connexion
🎜Résultats de l'exécution du code :🎜
$copy_of_object = clone $object;
Copier après la connexion
Copier après la connexion
🎜7 __isset()🎜🎜Avant d'utiliser la méthode __isset(), permettez-moi d'abord d'expliquer l'utilisation de la méthode isset(). La méthode isset() est principalement utilisée pour déterminer si cette variable est définie. 🎜🎜Si la méthode isset() est utilisée en dehors de l'objet, il existe deux situations : 🎜
  1. Si le paramètre est une propriété publique, vous pouvez utiliser la méthode isset() pour déterminer si la propriété est définie.
  2. Si le paramètre est une propriété privée, la méthode isset() ne fonctionnera pas.
🎜Donc, pour les propriétés privées, existe-t-il un moyen de savoir si elle est définie ? Bien entendu, tant que la méthode __isset() est définie dans la classe, la méthode isset() peut être utilisée en dehors de la classe pour déterminer si la propriété privée est définie. 🎜🎜Lorsque isset() ou empty() est appelé sur une propriété non définie ou inaccessible, la méthode __isset() est appelée. Voici un exemple : 🎜
<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    public function __clone()
    {
        echo __METHOD__."your are cloning the object.<br>";
    }

}

$person = new Person('John'); // Initially assigned.
$person2 = clone $person;

var_dump('persion1:');
var_dump($person);
echo '<br>';
var_dump('persion2:');
var_dump($person2);
Copier après la connexion
Copier après la connexion
🎜Le résultat de l'exécution du code est le suivant : 🎜
Person::__clone your are cloning the object.
string(9) "persion1:" object(Person)#1 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) }
string(9) "persion2:" object(Person)#2 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) }
Copier après la connexion
Copier après la connexion
🎜8. __unset()🎜🎜 est similaire à la méthodeisset() Lorsque la méthode unset() est appelée sur un ou non défini. Propriété inaccessible, la méthodeunset() sera appelée. Voici un exemple : 🎜
/**
 * file non_autoload.php
 */

require_once('project/class/A.php');
require_once('project/class/B.php');
require_once('project/class/C.php');
.
.
.

if (ConditionA) {
    $a = new A();
    $b = new B();
    $c = new C();
    // …
} else if (ConditionB) {
    $a = newA();
    $b = new B();
    // …
}
Copier après la connexion
Copier après la connexion
🎜Le résultat de l'exécution du code est le suivant : 🎜
/**
 * file autoload_demo.php
 */
function  __autoload($className) {
    $filePath = “project/class/{$className}.php”;
    if (is_readable($filePath)) {
        require($filePath);
    }
}

if (ConditionA) {
    $a = new A();
    $b = new B();
    $c = new C();
    // …
} else if (ConditionB) {
    $a = newA();
    $b = new B();
    // …
}
Copier après la connexion
Copier après la connexion
🎜9. La méthode __sleep()🎜🎜serialize() vérifiera s'il existe une méthode magique __sleep() dans la classe. Si elle est présente, cette méthode sera appelée en premier, puis l'opération de sérialisation sera effectuée. La méthode 🎜🎜__sleep() est généralement utilisée pour spécifier les attributs qui doivent être sérialisés avant de sauvegarder les données. Cette fonctionnalité peut s'avérer utile si vous disposez d'objets très volumineux qui n'ont pas tous besoin d'être enregistrés. 🎜🎜Pour plus de détails, veuillez vous référer au code suivant : 🎜
<?php
class C {
    private $prop;

    public function __construct($val) {
        $this->prop = $val;
    }

    /**
     * @return array
     */
    public function __debugInfo() {
        return [
            'propSquared' => $this->prop ** 2,
        ];
    }
}

var_dump(new C(42));
Copier après la connexion
Copier après la connexion
🎜Le résultat de l'exécution du code est le suivant : 🎜
object(C)#1 (1) { ["propSquared"]=> int(1764) }
Copier après la connexion
Copier après la connexion
🎜10 __wakeup()🎜🎜Par rapport à la méthodesleep(), la wakeup. () est généralement utilisée pour les opérations de désérialisation, telles que le rétablissement d'une connexion à une base de données ou l'exécution d'autres opérations d'initialisation. 🎜🎜Voici des exemples pertinents : 🎜rrreee🎜Les résultats de l'exécution du code sont les suivants : 🎜rrreee🎜11. __toString()🎜🎜Lors de l'utilisation de la méthode echo pour imprimer directement un objet, la méthode __toString() sera appelée. 🎜🎜Remarque : Cette méthode doit renvoyer une chaîne, sinon une erreur fatale sera générée au niveau E_RECOVERABLE_ERROR. Et vous ne pouvez pas non plus lever d'exception dans la méthode __toString(). 🎜🎜Ce qui suit est un exemple pertinent :🎜rrreee🎜Le résultat de l'exécution du code est le suivant :🎜rrreee🎜Alors, que se passe-t-il si la méthode __toString() n'est pas définie dans la classe ? Essayons-le. 🎜rrreee🎜Le résultat de l'exécution du code est le suivant :🎜
Catchable fatal error: Object of class Person could not be converted to string in D:\phpStudy\WWW\test\index.php on line 18
Copier après la connexion
Copier après la connexion

显然,它在页面上报告了一个致命错误,PHP语法不支持这样的写法。

12. __invoke()

当您尝试以调用函数的方式调用对象时,__ invoke()方法将被自动调用。

注意:此功能仅在PHP 5.3.0及更高版本中有效。

下面是相关实例:

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    public function __invoke() {
        echo 'This is an object';
    }

}

$person = new Person('John'); // Initially assigned.
$person();
Copier après la connexion
Copier après la connexion

运行代码结果如下:

This is an object
Copier après la connexion
Copier après la connexion

如果坚持使用对象作为方法(但未定义__invoke()方法),则将得到以下结果:

Fatal error: Function name must be a string in D:\phpStudy\WWW\test\index.php on line 18
Copier après la connexion
Copier après la connexion

13.__set_state()

从PHP 5.1.0开始,在调用var_export()导出类代码时会自动调用__set_state()方法。

__set_state()方法的参数是一个包含所有属性值的数组,其格式为array('property'=> value,...)

在以下示例中,我们没有定义__set_state()方法:

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

}

$person = new Person('John'); // Initially assigned.
var_export($person);
Copier après la connexion
Copier après la connexion

执行代码结果如下:

Person::__set_state(array( 'sex' => 'Male', 'name' => 'John', 'age' => 25, ))
Copier après la connexion
Copier après la connexion

显然,对象的属性已打印。

现在让我们看看定义__set_state()方法的另一种情况:

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    public static function __set_state($an_array)
    {
        $a = new Person();
        $a->name = $an_array['name'];
        return $a;
    }

}

$person = new Person('John'); // Initially assigned.
$person->name = 'Jams';
var_export($person);
Copier après la connexion
Copier après la connexion

执行代码结果如下:

Person::__set_state(array( 'sex' => 'Male', 'name' => 'Jams', 'age' => 25, ))
Copier après la connexion
Copier après la connexion

14. __clone()

在PHP中,我们可以使用clone关键字通过以下语法克隆对象:

$copy_of_object = clone $object;
Copier après la connexion
Copier après la connexion

但是,使用clone关键字只是一个浅拷贝,因为所有引用的属性仍将指向原始变量。

如果在对象中定义了clone()方法,则将在复制生成的对象中调用clone()方法,该方法可用于修改属性的值(如有必要)。

下面是相关的示例:

<?php
class Person
{
    public $sex;
    public $name;
    public $age;

    public function __construct($name="",  $age=25, $sex=&#39;Male&#39;)
    {
        $this->name = $name;
        $this->age  = $age;
        $this->sex  = $sex;
    }

    public function __clone()
    {
        echo __METHOD__."your are cloning the object.<br>";
    }

}

$person = new Person('John'); // Initially assigned.
$person2 = clone $person;

var_dump('persion1:');
var_dump($person);
echo '<br>';
var_dump('persion2:');
var_dump($person2);
Copier après la connexion
Copier après la connexion

运行代码结果如下:

Person::__clone your are cloning the object.
string(9) "persion1:" object(Person)#1 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) }
string(9) "persion2:" object(Person)#2 (3) { ["sex"]=> string(3) "Male" ["name"]=> string(6) "John" ["age"]=> int(25) }
Copier après la connexion
Copier après la connexion

15.__autoload()

__autoload()方法可以尝试加载未定义的类。

过去,如果要在程序文件中创建100个对象,则必须使用include()或require()来包含100个类文件,或者必须在同一类文件中定义100个类。 例如以下:

/**
 * file non_autoload.php
 */

require_once('project/class/A.php');
require_once('project/class/B.php');
require_once('project/class/C.php');
.
.
.

if (ConditionA) {
    $a = new A();
    $b = new B();
    $c = new C();
    // …
} else if (ConditionB) {
    $a = newA();
    $b = new B();
    // …
}
Copier après la connexion
Copier après la connexion

那么,如果我们使用__autoload()方法呢?

/**
 * file autoload_demo.php
 */
function  __autoload($className) {
    $filePath = “project/class/{$className}.php”;
    if (is_readable($filePath)) {
        require($filePath);
    }
}

if (ConditionA) {
    $a = new A();
    $b = new B();
    $c = new C();
    // …
} else if (ConditionB) {
    $a = newA();
    $b = new B();
    // …
}
Copier après la connexion
Copier après la connexion

当PHP引擎第一次使用类A时,如果未找到类A,则autoload方法将被自动调用,并且类名称“ A”将作为参数传递。因此,我们在autoload()方法中需要做的是根据类名找到相应的类文件,然后将其包含在内。如果找不到该文件,则php引擎将抛出异常。

16. __debugInfo()

当执行 var_dump() 方法时,__debugInfo() 方法会被自动调用。如果 __debugInfo() 方法未被定义,那么 var_dump 方法或打印出这个对象的所有属性。

举例说明:

<?php
class C {
    private $prop;

    public function __construct($val) {
        $this->prop = $val;
    }

    /**
     * @return array
     */
    public function __debugInfo() {
        return [
            'propSquared' => $this->prop ** 2,
        ];
    }
}

var_dump(new C(42));
Copier après la connexion
Copier après la connexion

执行结果:

object(C)#1 (1) { ["propSquared"]=> int(1764) }
Copier après la connexion
Copier après la connexion

注意:__debugInfo() 方法应该在 PHP 5.6.0 及以上版本中使用。

总结

以上就是我所了解的 PHP 魔术方法,其中常用的包括 __set() 还有 __get()__autoload()。如果你还有其他疑问,可以从 PHP 官方网站获得更多帮助。

原文地址:https://www.tutorialdocs.com/article/16-php-magic-methods.html

译文地址:https://learnku.com/php/t/40919

推荐学习:《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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Guide d'installation et de mise à niveau de PHP 8.4 pour Ubuntu et Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 apporte plusieurs nouvelles fonctionnalités, améliorations de sécurité et de performances avec une bonne quantité de dépréciations et de suppressions de fonctionnalités. Ce guide explique comment installer PHP 8.4 ou mettre à niveau vers PHP 8.4 sur Ubuntu, Debian ou leurs dérivés. Bien qu'il soit possible de compiler PHP à partir des sources, son installation à partir d'un référentiel APT comme expliqué ci-dessous est souvent plus rapide et plus sécurisée car ces référentiels fourniront les dernières corrections de bogues et mises à jour de sécurité à l'avenir.

Comment configurer Visual Studio Code (VS Code) pour le développement PHP Comment configurer Visual Studio Code (VS Code) pour le développement PHP Dec 20, 2024 am 11:31 AM

Visual Studio Code, également connu sous le nom de VS Code, est un éditeur de code source gratuit – ou environnement de développement intégré (IDE) – disponible pour tous les principaux systèmes d'exploitation. Avec une large collection d'extensions pour de nombreux langages de programmation, VS Code peut être c

7 fonctions PHP que je regrette de ne pas connaître auparavant 7 fonctions PHP que je regrette de ne pas connaître auparavant Nov 13, 2024 am 09:42 AM

Si vous êtes un développeur PHP expérimenté, vous aurez peut-être le sentiment d'y être déjà allé et de l'avoir déjà fait. Vous avez développé un nombre important d'applications, débogué des millions de lignes de code et peaufiné de nombreux scripts pour réaliser des opérations.

Comment analysez-vous et traitez-vous HTML / XML dans PHP? Comment analysez-vous et traitez-vous HTML / XML dans PHP? Feb 07, 2025 am 11:57 AM

Ce tutoriel montre comment traiter efficacement les documents XML à l'aide de PHP. XML (Language de balisage extensible) est un langage de balisage basé sur le texte polyvalent conçu à la fois pour la lisibilité humaine et l'analyse de la machine. Il est couramment utilisé pour le stockage de données et

Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Expliquez les jetons Web JSON (JWT) et leur cas d'utilisation dans les API PHP. Apr 05, 2025 am 12:04 AM

JWT est une norme ouverte basée sur JSON, utilisée pour transmettre en toute sécurité des informations entre les parties, principalement pour l'authentification de l'identité et l'échange d'informations. 1. JWT se compose de trois parties: en-tête, charge utile et signature. 2. Le principe de travail de JWT comprend trois étapes: la génération de JWT, la vérification de la charge utile JWT et l'analyse. 3. Lorsque vous utilisez JWT pour l'authentification en PHP, JWT peut être généré et vérifié, et les informations sur le rôle et l'autorisation des utilisateurs peuvent être incluses dans l'utilisation avancée. 4. Les erreurs courantes incluent une défaillance de vérification de signature, l'expiration des jetons et la charge utile surdimensionnée. Les compétences de débogage incluent l'utilisation des outils de débogage et de l'exploitation forestière. 5. L'optimisation des performances et les meilleures pratiques incluent l'utilisation des algorithmes de signature appropriés, la définition des périodes de validité raisonnablement,

Programme PHP pour compter les voyelles dans une chaîne Programme PHP pour compter les voyelles dans une chaîne Feb 07, 2025 pm 12:12 PM

Une chaîne est une séquence de caractères, y compris des lettres, des nombres et des symboles. Ce tutoriel apprendra à calculer le nombre de voyelles dans une chaîne donnée en PHP en utilisant différentes méthodes. Les voyelles en anglais sont a, e, i, o, u, et elles peuvent être en majuscules ou en minuscules. Qu'est-ce qu'une voyelle? Les voyelles sont des caractères alphabétiques qui représentent une prononciation spécifique. Il y a cinq voyelles en anglais, y compris les majuscules et les minuscules: a, e, i, o, u Exemple 1 Entrée: String = "TutorialSpoint" Sortie: 6 expliquer Les voyelles dans la chaîne "TutorialSpoint" sont u, o, i, a, o, i. Il y a 6 yuans au total

Expliquez la liaison statique tardive en PHP (statique: :). Expliquez la liaison statique tardive en PHP (statique: :). Apr 03, 2025 am 12:04 AM

Liaison statique (statique: :) ​​implémente la liaison statique tardive (LSB) dans PHP, permettant à des classes d'appel d'être référencées dans des contextes statiques plutôt que de définir des classes. 1) Le processus d'analyse est effectué au moment de l'exécution, 2) Recherchez la classe d'appel dans la relation de succession, 3) il peut apporter des frais généraux de performance.

Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Quelles sont les méthodes PHP Magic (__construct, __ destruct, __ call, __get, __set, etc.) et fournir des cas d'utilisation? Apr 03, 2025 am 12:03 AM

Quelles sont les méthodes magiques de PHP? Les méthodes magiques de PHP incluent: 1. \ _ \ _ Construct, utilisé pour initialiser les objets; 2. \ _ \ _ Destruct, utilisé pour nettoyer les ressources; 3. \ _ \ _ Appel, gérer les appels de méthode inexistants; 4. \ _ \ _ GET, Implémentez l'accès à l'attribut dynamique; 5. \ _ \ _ SET, Implémentez les paramètres d'attribut dynamique. Ces méthodes sont automatiquement appelées dans certaines situations, améliorant la flexibilité et l'efficacité du code.

See all articles