Mit PHP 5.3 Ich habe seltsame/nicht-intuitive Verhalten bei der Anwendung empty()
auf dynamische Objekteigenschaften über die __get()
Überladung Funktion abgerufen. Betrachten Sie das folgende Code-Snippet:PHP empty() auf __get Accessor
<?php
class Test {
protected $_data= array(
'id'=> 23,
'name'=> 'my string'
);
function __get($k) {
return $this->_data[$k];
}
}
$test= new Test();
var_dump("Accessing directly:");
var_dump($test->name);
var_dump($test->id);
var_dump(empty($test->name));
var_dump(empty($test->id));
var_dump("Accessing after variable assignment:");
$name= $test->name;
$id= $test->id;
var_dump($name);
var_dump($id);
var_dump(empty($name));
var_dump(empty($id));
?>
Die Ausgabe dieser Funktion ist wie folgt. Vergleichen Sie die Ergebnisse der empty()
Kontrollen der ersten und zweiten Ergebnismengen:
Set # 1, unerwartetes Ergebnis:
string(19) "Accessing directly:"
string(9) "my string"
int(23)
bool(true)
bool(true)
Set Erwartet 1 # das gleiche wie Set # 2 zurückzukehren:
string(36) "Accessing after variable assignment:"
string(9) "my string"
int(23)
bool(false)
bool(false)
Das ist wirklich verwirrend und nicht intuitiv. Die Objekteigenschaften geben nicht leere Zeichenfolgen aus, aber empty()
betrachtet sie als leere Zeichenfolgen. Was ist denn hier los?
Sieht in der Tat sehr merkwürdig aus. Meine einzige Annahme ist, dass Leerstelle(), die ein Sprachkonstrukt ist, irgendwie die Getterfunktion umgeht. Aber das wäre ein großer Fehler in meinem Verständnis - es muss eine bessere Erklärung geben. Interessiert zu sehen, was aufkommt. –
interessanterweise gibt 'isset()' true zurück, wenn direkt zugegriffen wird. – nickf
Alan Storm hat es richtig gemacht, es gibt eine __isset magische Funktion, die aufgerufen wird, wenn ein Mitglied durch leer() überprüft wird. –