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


Esempio

Ogni volta che si tenta di recuperare un determinato campo da una classe in questo modo:

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

PHP invoca il metodo magico __get($name) , con $name uguale a "height" in questo caso. Scrivere in un campo classe in questo modo:

$animal->height = 10;

__set($name, $value) metodo magico __set($name, $value) , con $name uguale a "height" e $value uguale a 10 .

PHP ha anche due funzioni built-in isset() , che controllano se esiste una variabile e unset() , che distrugge una variabile. Verifica se un campo oggetti è impostato in questo modo:

isset($animal->height);

__isset($name) la funzione __isset($name) su quell'oggetto. Distruggere una variabile in questo modo:

unset($animal->height);

__unset($name) la funzione __unset($name) su quell'oggetto.

Normalmente, quando non si definiscono questi metodi sulla classe, PHP recupera semplicemente il campo così come è memorizzato nella classe. Tuttavia, puoi sovrascrivere questi metodi per creare classi che possano contenere dati come una matrice, ma che siano utilizzabili come un oggetto:

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

funzione vuota () e metodi magici

Nota che chiamare empty() su un attributo di classe invocherà __isset() perché come afferma il manuale PHP:

empty () è essenzialmente l'equivalente conciso di ! isset ($ var) || $ var == false