WARUM PASSIERT DIES?
Im Laufe der Zeit hat sich PHP zu einer sicherheitsorientierteren Sprache entwickelt. Einstellungen, die früher standardmäßig deaktiviert waren, sind jetzt standardmäßig aktiviert. Ein perfektes Beispiel hierfür ist E_STRICT
, dass es ab PHP 5.4.0 standardmäßig aktiviert wurde .
Darüber hinaus ist laut PHP-Dokumentation E_NOTICE
in der php.ini standardmäßig deaktiviert. PHP-Dokumente empfehlen , es für Debugging-Zwecke zu aktivieren . Wenn ich jedoch PHP aus dem Ubuntu-Repository und vom Windows-Stack von BitNami herunterlade, sehe ich etwas anderes.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Beachten Sie, dass error_reporting
der Standardwert standardmäßig auf den Produktionswert und nicht standardmäßig auf den Standardwert eingestellt ist. Dies ist etwas verwirrend und wird nicht außerhalb von php.ini dokumentiert, daher habe ich dies bei anderen Distributionen nicht validiert.
Um Ihre Frage zu beantworten, wird dieser Fehler jetzt angezeigt, wenn er zuvor nicht angezeigt wurde, weil:
Sie haben PHP installiert und die neuen Standardeinstellungen sind etwas schlecht dokumentiert, schließen sie jedoch nicht aus E_NOTICE
.
E_NOTICE
Warnungen wie undefinierte Variablen und undefinierte Indizes tragen tatsächlich dazu bei, Ihren Code sauberer und sicherer zu machen. Ich kann Ihnen sagen, dass ich vor Jahren E_NOTICE
gezwungen war, meine Variablen zu deklarieren, wenn ich aktiviert blieb. Es machte es viel einfacher, C zu lernen, wenn man nicht deklariert, dass Variablen viel störender sind.
WAS KANN ICH TUN?
Deaktivieren Sie diese Option, E_NOTICE
indem Sie den "Standardwert" kopieren E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
und durch den derzeit nicht kommentierten Wert ersetzen, nachdem Sie sich gleich angemeldet haben error_reporting =
. Starten Sie Apache oder PHP neu, wenn Sie CGI oder FPM verwenden. Stellen Sie sicher, dass Sie die "richtige" php.ini bearbeiten. Das richtige ist Apache, wenn Sie PHP mit Apache ausführen, fpm oder php-fpm, wenn Sie PHP-FPM ausführen, cgi, wenn Sie PHP-CGI ausführen usw. Dies ist nicht die empfohlene Methode, aber wenn Sie Legacy-Code haben, der dies tun wird Wenn es äußerst schwierig ist, es zu bearbeiten, ist es möglicherweise die beste Wahl.
Deaktivieren Sie E_NOTICE
auf Datei- oder Ordnerebene. Dies ist möglicherweise vorzuziehen, wenn Sie über Legacy-Code verfügen, die Dinge aber ansonsten "richtig" ausführen möchten. Wenden Sie sich dazu an Apache2, Nginx oder einen Server Ihrer Wahl. In Apache würden Sie php_value
innerhalb von verwenden <Directory>
.
Schreiben Sie Ihren Code neu, um sauberer zu sein. Wenn Sie dies tun müssen, während Sie in eine Produktionsumgebung wechseln oder nicht möchten, dass jemand Ihre Fehler sieht, stellen Sie sicher, dass Sie die Fehleranzeige deaktivieren und nur Ihre Fehler protokollieren (siehe display_errors
und log_errors
in der php.ini und Ihren Servereinstellungen). .
So erweitern Sie Option 3: Dies ist das Ideal. Wenn Sie diesen Weg gehen können, sollten Sie. Wenn Sie diese Route anfangs nicht verwenden, sollten Sie diese Route eventuell verschieben, indem Sie Ihren Code in einer Entwicklungsumgebung testen. Wenn Sie schon dabei sind, sollten Sie loswerden ~E_STRICT
und ~E_DEPRECATED
sehen, was in Zukunft schief gehen könnte. Sie werden eine Menge ungewohnter Fehler sehen, aber es wird Sie davon abhalten, unangenehme Probleme zu haben, wenn Sie PHP in Zukunft aktualisieren müssen.
WAS BEDEUTEN DIE FEHLER?
Undefined variable: my_variable_name
- Dies tritt auf, wenn vor der Verwendung keine Variable definiert wurde. Wenn das PHP-Skript ausgeführt wird, nimmt es intern nur einen Nullwert an. In welchem Szenario müssten Sie jedoch eine Variable überprüfen, bevor sie definiert wurde? Letztendlich ist dies ein Argument für "schlampigen Code". Als Entwickler kann ich Ihnen sagen, dass ich es liebe, wenn ich ein Open-Source-Projekt sehe, bei dem Variablen in ihren Bereichen so hoch definiert sind, wie sie definiert werden können. Es macht es einfacher zu sagen, welche Variablen in Zukunft auftauchen werden, und es erleichtert das Lesen / Lernen des Codes.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Dies tritt auf, wenn Sie versuchen, auf einen Wert in einem Array zuzugreifen, der nicht vorhanden ist. Führen Sie eine bedingte Prüfung durch, um diesen Fehler zu vermeiden.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Eine andere Möglichkeit besteht darin, ein leeres Array oben in Ihrer Funktion zu deklarieren. Dies ist nicht immer möglich.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(zusätzlicher Tipp)
- Als ich auf diese und andere Probleme stieß, verwendete ich NetBeans IDE (kostenlos) und es gab mir eine Vielzahl von Warnungen und Hinweisen. Einige von ihnen bieten sehr hilfreiche Tipps. Dies ist keine Voraussetzung und ich verwende keine IDEs mehr, außer für große Projekte. Ich bin
vim
heutzutage eher eine Person :).