2010-03-12 7 views

Répondre

0

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).

+0

Je veux savoir quelle fonction magique est appelé à 'vide ($ this-> attr)' – user198729

13

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é.

+0

Ainsi, le résultat est toujours le même ou ' isset() 'ou' empty() '? – user198729

+0

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

+0

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

0

property_exists() ne fonctionne pas pour vous si vous ne faites que tester si une variable de classe existe?

3

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)

Questions connexes