php

Vorsicht bei der Verwendung von isset() mit Arrays

Manchmal sucht man Fehler, die man wieder und wieder überliest, weil man die falschen Annahmen getroffen hat und der Code oberflächlich richtig aussieht. Erfahrungsgemäß gibt es dann ein paar „übliche Verdächtige“, die man sich genauer anschaut. Zuweisungen im if-Statement, Vergleiche ohne Typprüfung, empty() und isset() sind dabei immer heiße Kandidaten.

Wenn man die Handbuch-Seite zu isset() durchliest, klingt es, als wäre es problemlos möglich auch die Existenz von Array-Keys zu prüfen. Sogar ein schönes Beispiel gibt es dazu:

Doch ganz so einfach ist es leider nicht. Interessant ist hier vor allem die letzte Zeile. Erst auf den zweiten Blick fällt auf, dass als erster Schlüssel „cake“ statt „pie“ verwendet wird. Und das ist der einzige Grund dafür, dass FALSE zurückgegeben wird. Ändert man nämlich den ersten Schlüssel auf „pie“, wird TRUE zurückgegeben, auch wenn der dritte Key nicht existiert:

Das Problem und die Lösung wird auch in einem Kommentar von 2004 angesprochen. Die Prüfung mit isset() reicht nicht aus. Zusätzlich muss auf den vorletzen Key mit is_array() geprüft werden:

Wichtig ist hier auch, dass man zuerst das isset() und danach das is_array() schreibt, sonst bekommt man einen Undefined-index-Fehler, wenn der Schlüssel komplett nicht vorhanden ist. Ein alleinstehendes isset() in Verbindung mit einem Array sollte einen also immer misstrauisch machen. Je nach Fall sollte ein is_array() ergänzt oder ein array_key_exists() bevorzugt werden.

Hinterlasse einen Kommentar

1 Kommentar auf "Vorsicht bei der Verwendung von isset() mit Arrays"

Benachrichtige mich zu:
avatar

Sortiert nach:   neuste | älteste | beste Bewertung
Fabian Blechschmidt
Gast
6 Jahre 5 Monate her

Jetzt bin ich platt.

Danke David für die Info, gut zu wissen!

wpDiscuz
Weitere Beiträge zum Thema
TYPO3 Performance-Verbesserungen durch PHP 5.3: 30%
Kundengebundene Fehler finden – Magento 2
Ant für Eclipse 3.6 Helios
Rechtsanwalt Clemens Pfitzer als Gastreferent beim 19. E-Commerce Stammtisch