Il ne faut pas __isset
, parce isset()
n'est pas la même chose que empty()
Quelle est la fonction magique de empty() en PHP?
Répondre
Je pense qu'en général, vous constaterez que ce qui suit est l'équivalent PHP:
isset($variable[0])
Si, par exemple, variable est une chaîne, cela détecterait que la chaîne était vide. Cela fonctionnerait de la même manière pour les types les plus primitifs (sinon tous).
Comme il est dit sur this page:
__isset() est déclenchée en appelant isset() ou vide() sur inaccessibles propriétés.
Il n'y a pas de magie méthode dédiée à vide()
Si __isset() retourne true, vide() invoquera alors __get() pour vérifier la valeur de la propriété.
Ainsi, le résultat est toujours le même ou ' isset() 'ou' empty() '? – user198729
Oui, si votre méthode __isset renvoie true, empty() et isset() retourneront true. Vous devriez probablement implémenter une méthode "non magique" pour faire la vérification de empty(), et garder __isset seulement pour isset() – Inspire
Hmm en fait, il semble que empty() retourne true si la méthode __isset retourne false mais isset() renvoie false dans ce cas. Si __isset renvoie true, ils retournent tous les deux true (testé sur PHP 5.3.0) – Inspire
property_exists()
ne fonctionne pas pour vous si vous ne faites que tester si une variable de classe existe?
En complément à la réponse de Inspire:
class Foo {
public function __isset($name) {
echo "public function __isset($name)\n";
return 'bar'===$name;
}
public function __get($name) {
echo "public function __get($name)\n";
return 'bar'===$name ? 0 : NULL;
}
}
$foo = new Foo;
echo empty($foo->foo) ? ' empty' : ' not empty', "\n";
echo empty($foo->bar) ? ' empty' : ' not empty', "\n";
la sortie est
public function __isset(foo)
empty
public function __isset(bar)
public function __get(bar)
empty
sens pour la première propriété (foo) vide() n'invoquaient __isset() qui retourne faux - > empty($foo->foo)===true
Pour la deuxième propriété (barre) __isset() a été appelée et elle a renvoyé true. Ensuite, la propriété est récupérée via __get() et interprétée comme une valeur booléenne (voir http://docs.php.net/language.types.type-juggling). Et depuis (bool) 0 est false
, vide() retourne également true
pour empty($foo->bar)
Je veux savoir quelle fonction magique est appelé à 'vide ($ this-> attr)' – user198729