isset und arrays

Von Günter vor kurzen drauf angesprochen wollte ich hier nochmal ein paar Worte zur Verwendung von isset im Zusammenhang mit Arrays verlieren.

Viele Entwickler nutzen isset um zu prüfen ob ein bestimmtes Feld in einem Array existiert. Beispiel:


$foo = array(
    'a' => 'b'
);
if(isset($foo['a']))
{
    // returns true
}

Was passiert aber wenn nun $foo kein Array sondern beispielsweise ein String ist? Beispiel:


$foo = "string";
if(isset($foo['a']))
{
    // returns true
}

Die Funktion liefert in diesem Fall ebenfalls true zurück. Diese Tatsache ist insoweit korrekt als dass isset eigentlich dazu gedacht ist zu prüfen, ob eine Variable überhaupt deklariert ist. In diesem Fall ist $foo natürlich deklariert. Problematisch ist allerdings, dass bei dem oberen Beispielcode keinerlei Fehlermeldung von PHP ausgegeben wird.

Auch kleinere Tricks wie das folgende Beispiel helfen nicht weiter.


$foo = array('a' => 'b');
if(isset($foo['a']{0}))
{
    // returns true
}

Diese Methode scheint zwar auf den ersten Blick das richtige Ergebnis zu liefern, tut dies aber auch nur solage $foo['a'] vom Typ string ist. Enthält $foo['a'] einen Interger Wert versagt auch diese Methode.

Um zu prüfen ob ein bestimmter Schlüssel in einem Array existiert sollte man also die dafür vorgesehene Funktion array_key_exists verwenden. Aber auch hier gibt es Probleme. Denn PHP ist beim Aufruf dieser Funktion sehr kleinlich und wirft Fehlermeldungen für den Fall, dass a) Das überprüfte Array nicht deklariert ist oder b) Das überprüfte Element nicht vom Typ Array ist.

Es bleibt also nur folgende Möglichkeit um zu prüfen ob ein Schlüssel in einem Array existiert bei der keine Fehlermeldung ausgespuckt werden und es nicht zu falschen Ergebnissen kommt:


$foo = array('a' => 'b');
if(isset($foo) && is_array($foo) && array_key_exists('a', $foo))
{
    // returns true
}

Selbstverständlich kann man diesem Problem aus dem Weg gehen wenn man vernünftig mit Datentypen umgeht ;)