am 15. Februar 2010
So nachdem wir den Freitag ja noch fast friedlich zu ende gebracht haben, widmen wir uns heute mal wieder einem technischen Thema, dass ich jetzt gerade übrigens ins OpenOffice tippe. Toll, oder? Geht so! Wisst ihr was aber wirklich toll ist? Unser Workshop für die International PHP Conference wurde angenommen. Wer als etwas zum Thema „advanced Eclipse“ wissen will, der sollte vorbei schauen. Werde einen halben Tag zusammen mit Bastian Feder und vielleicht Sven Kiera über ein paar PDT Features reden, die ihr noch nicht kennt (hoffe ich einfach mal).
Die letzte Woche bin ich mal wieder über ein mir schon bekanntes Problem mit PHP und empty gestoßen. Mir ist aber aufgefallen, dass ich es noch nie dokumentiert habe und ich dies mal nachholen sollte, bevor ich wieder alles vergessen habe und das Wissen für immer in den Tiefen des Internets verschwindet. Außerdem ist es gut, wenn man es mal gelesen hat und sich dann wieder erinnert.
Wow, schon fast der ganze Artikel rum und ich habe noch kein Wort über das eigentliche Thema geschrieben. Ist auch neuer Rekord im „drumrumreden“. Wobei geht es also heute? PHP verhält sich bei der empty Methode ein wenig anders als man es erwartet, wenn man damit auf magische Methoden losgeht. Ein kleines Beispiel:
class MagicClass
{
public $theArray = array( '1' );
public function __get( $name )
{
return array( '1' );
}
}
$magic = new MagicClass();
var_dump( empty( $magic->theArray ) );
var_dump( empty( $magic->theMagicArray ) );
Wir wissen alle, dass die magische __get Methode immer dann aufgerufen wird, wenn man auf ein Attribut lesend zugreift, welches nicht existiert. Wenn man sich das Beispiel anschaut, so müsste beide var_dump ein false zurückliefern. Tun sie aber leider nicht. Der erste Aufruf, mit dem existierenden Attribut liefert natürlich ein false. So weit so gut. Der zweite Aufruf aber leider nicht. Komischerweise wird die magische Methode gar nicht aufgerufen und somit kommt dort etwas leeres zurück und das ist natürlich empty.
Mit ein wenig rumgooglen könnte man jetzt wahrscheinlich rausfinden was genau kaputt ist, da ich aber gerade im Zug von Freiburg nach Hamburg sitze und keinen Internetzugang habe, muss ich das euch oder einem der kommenden Artikel überlassen.
Lösung: Danke erstmal an KingCrunch und Sebastian. Die Lösung des Problems ist einfach. Die empty Funktion erwartet, dass die magische Methode __isset( ) auch mit Leben gefüllt ist, dann klappt das ganze nämlich ohne Probleme.