Hinweis / Warnung: Undefinierte Variable
Aus der umfangreichen Weisheit des PHP-Handbuchs:
Sich auf den Standardwert einer nicht initialisierten Variablen zu verlassen, ist problematisch, wenn eine Datei in eine andere inkludiert wird, die denselben Variablennamen verwendet. Es ist auch ein wesentliches Sicherheitsrisiko bei aktiviertem register_globals. Ein E_NOTICE-Fehler wird im Falle von nicht initialisierten Variablen ausgegeben, jedoch nicht im Falle des Anfügens von Elementen an das nicht initialisierte Array. Die Sprachkonstruktion isset() kann verwendet werden, um festzustellen, ob eine Variable bereits initialisiert wurde. Zusätzlich und idealer ist die Lösung von empty(), da sie keine Warn- oder Fehlermeldungen generiert, wenn die Variable nicht initialisiert ist.
Aus PHP-Dokumentation:
Es wird keine Warnung generiert, wenn die Variable nicht existiert. Das bedeutet, dass empty() im Wesentlichen das knappe Äquivalent zu !isset($var) || $var == false ist.
Dies bedeutet, dass Sie nur empty()
verwenden könnten, um festzustellen, ob die Variable gesetzt ist, und zusätzlich prüft sie die Variable gegen die folgenden Werte: 0
, 0.0
, ""
, "0"
, null
, false
oder []
.
Beispiel:
$o = [];
@$var = ["",0,null,1,2,3,$foo,$o['myIndex']];
array_walk($var, function($v) {
echo (!isset($v) || $v == false) ? 'true ' : 'false';
echo ' ' . (empty($v) ? 'true' : 'false');
echo "\n";
});
Testen Sie den obigen Codeausschnitt im 3v4l.org Online-PHP-Editor
Obwohl PHP keine Variablendeklaration erfordert, empfiehlt es diese, um bestimmte Sicherheitslücken oder Fehler zu vermeiden, bei denen vergessen wird, einer Variablen, die später im Skript verwendet wird, einen Wert zuzuweisen. Was PHP im Fall von nicht deklarierten Variablen macht, ist das Ausgeben eines sehr niederstufigen Fehlers, E_NOTICE
, der standardmäßig nicht einmal gemeldet wird, jedoch rät das Handbuch dazu, dies während der Entwicklung zuzulassen.
Möglichkeiten, mit dem Problem umzugehen:
-
Empfohlen: Deklarieren Sie Ihre Variablen, zum Beispiel wenn Sie versuchen, einen String an eine nicht definierte Variable anzuhängen. Oder verwenden Sie isset()
/ !empty()
um zu überprüfen, ob sie deklariert sind, bevor Sie auf sie verweisen, wie hier:
//Initialisierung der Variablen
$value = ""; //Initialisierungswert; Beispiele
//"" Wenn Sie später noch Dinge anhängen möchten
//0 Wenn Sie später Zahlen hinzufügen möchten
//isset()
$value = isset($_POST['value']) ? $_POST['value'] : '';
//empty()
$value = !empty($_POST['value']) ? $_POST['value'] : '';
Dies ist seit PHP 7.0 viel sauberer geworden, jetzt können Sie den null-coalesce-Operator verwenden:
// Null-coalesce-Operator - Keine explizite Initialisierung der Variablen erforderlich.
$value = $_POST['value'] ?? '';
-
Richten Sie einen benutzerdefinierten Fehlerhandler für E_NOTICE ein und leiten Sie die Meldungen weg von der Standardausgabe (vielleicht in eine Protokolldatei):
set_error_handler('myHandlerForMinorErrors', E_NOTICE | E_STRICT)
-
Deaktivieren Sie die Berichterstattung über E_NOTICE. Eine schnelle Möglichkeit, nur E_NOTICE
auszuschließen, lautet:
error_reporting( error_reporting() & ~E_NOTICE )
-
Unterdrücken Sie den Fehler mit dem @-Operator.
Hinweis: Es wird dringend empfohlen, nur Punkt 1 zu implementieren.
Hinweis: Undefinierter Index / Undefinierter Offset / Warnung: Undefinierter Array-Key
Dieser Hinweis/diese Warnung erscheint, wenn Sie (oder PHP) versuchen, auf einen undefinierten Index eines Arrays zuzugreifen.
Möglichkeiten, mit dem Problem umzugehen:
-
Überprüfen Sie, ob der Index existiert, bevor Sie darauf zugreifen. Hierfür können Sie isset()
oder array_key_exists()
verwenden:
//isset()
$value = isset($array['my_index']) ? $array['my_index'] : '';
//array_key_exists()
$value = array_key_exists('my_index', $array) ? $array['my_index'] : '';
-
Das Sprachkonstrukt list()
kann dies generieren, wenn es versucht, auf einen Array-Index zuzugreifen, der nicht existiert:
list($a, $b) = array(0 => 'a');
//oder
list($one, $two) = explode(',', 'Test-String');
Zwei Variablen werden verwendet, um auf zwei Array-Elemente zuzugreifen, jedoch gibt es nur ein Array-Element, Index 0
, daher wird Folgendes generiert:
Hinweis: Undefinierter Offset: 1
$_POST
/ $_GET
/ $_SESSION
-Variable
Die obigen Hinweise erscheinen häufig beim Arbeiten mit $_POST
, $_GET
oder $_SESSION
. Für $_POST
und $_GET
müssen Sie einfach überprüfen, ob der Index existiert, bevor Sie ihn verwenden. Für $_SESSION
müssen Sie sicherstellen, dass die Sitzung mit session_start()
gestartet wurde und dass der Index ebenfalls existiert.
Beachten Sie auch, dass alle 3 Variablen superglobal sind und großgeschrieben werden.
Verwandte: