PHP stellt fest, dass die benannte Konstante test nicht existiert und nimmt deshalb an, du hättest stattdessen den String 'test' gemeint. Nach der internen Fehlerkorrektur lautet der Ausdruck also
if ('text')
, und der ergibt true. Das muss man nicht gut finden, aber wohl akzeptieren.
Naja. Man kann da was "veranstalten" und im Fall einer Notiz/Warnung abbrechen:
<?php
function errHandle($errNo, $errStr, $errFile, $errLine) {
$msg = "$errStr in $errFile on line $errLine";
if ($errNo == E_NOTICE || $errNo == E_WARNING) {
throw new ErrorException($msg, $errNo);
} else {
echo $msg;
}
}
set_error_handler('errHandle');
if (foo) { echo foo; }
echo "Das darf nicht mehr ausgegeben werden.";
?>
Perl verhält sich übrigens ähnlich:
#!/usr/bin/perl -W
#use strict;
if (test) { print STDOUT wahr, "\r\n" };
print "Das soll nicht mehr ausgegeben werden.", "\r\n";
Noch grausamer wird es (weil keine Warnung erfolgt), wenn man das -w oder -W in der shebang vergisst. Aber von daher kommt wohl das Verhalten in PHP. Allerdings kann man in Perl dann immer noch ein einfaches use strict verwenden (oben das Kommentarzeichen entfernen) um ein brauchbares, fehlerintolerantes Verhalten zu erzwingen.
In PHP kann man das nachbauen, in dem man den Teil:
<?php
function errHandle($errNo, $errStr, $errFile, $errLine) {
$msg = "$errStr in $errFile on line $errLine";
if ($errNo == E_NOTICE || $errNo == E_WARNING) {
throw new ErrorException($msg, $errNo);
} else {
echo $msg;
}
}
set_error_handler('errHandle');
z.B. nach /foo/bar/use_strict.php schreibt (am besten ohne schließendes '?>'!) und dann so verwendet:
<?php
require '/foo/bar/use_strict.php';
if (foo) { echo foo; }
echo "Das soll nicht mehr ausgegeben werden.";
?>