PHP __get (), __set (), __isset () et __unset ()


Exemple

Chaque fois que vous essayez de récupérer un certain champ d'une classe comme ceci:

$animal = new Animal();
$height = $animal->height;

PHP appelle la méthode magique __get($name) , avec $name égal à "height" dans ce cas. Écrire dans un champ de classe comme ceci:

$animal->height = 10;

Invoquera la méthode magique __set($name, $value) , avec $name égal à "height" et $value égal à 10 .

PHP a également deux fonctions isset() , qui vérifient si une variable existe et unset() , ce qui détruit une variable. Vérifier si un champ d'objets est défini comme ceci:

isset($animal->height);

Invoquera la fonction __isset($name) sur cet objet. Détruire une variable comme ça:

unset($animal->height);

Invoquera la fonction __unset($name) sur cet objet.

Normalement, lorsque vous ne définissez pas ces méthodes sur votre classe, PHP récupère simplement le champ tel qu'il est stocké dans votre classe. Cependant, vous pouvez remplacer ces méthodes pour créer des classes pouvant contenir des données comme un tableau, mais utilisables comme un objet:

class Example {
    private $data = [];

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

    public function __get($name) {
        if (!array_key_exists($name, $this->data)) {
            return null;
        }

        return $this->data[$name];
    }

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

    public function __unset($name) {
        unset($this->data[$name]);
    }
}

$example = new Example();

// Stores 'a' in the $data array with value 15
$example->a = 15;

// Retrieves array key 'a' from the $data array
echo $example->a; // prints 15

// Attempt to retrieve non-existent key from the array returns null
echo $example->b; // prints nothing

// If __isset('a') returns true, then call __unset('a')
if (isset($example->a)) {
    unset($example->a));
}

fonction empty () et méthodes magiques

Notez que l'appel à empty() sur un attribut de classe invoquera __isset() car, comme l'indique le manuel PHP:

empty () est essentiellement l'équivalent concis de ! isset ($ var) || $ var == false