Wahr oder falsch? Der Ärger mit dem if
PHP hat eine sogenannte automatische
Typumwandlung. So praktisch dies aus mehreren Gründen sein kann, so schwierig ist es auch manchmal es im Falle von PHP wirklich zu durschauen. Deshalb sei allen Programmierern der folgende kurze Artikel ans Herz gelegt.
Der Zahlenwert 0
Der Zahlenwert 0 signalisiert, dass keine Fehler passiert sind. Man könnte auch sagen er steht für nichts, was Mathematiker gar nicht gerne hören. Also wie würden Sie sich entscheiden, wenn Sie dem Wert 0 einen Wert von "falsch" und "wahr" zuordnen müssten?
PHP führt das Typecasting von Integer "0" zu Boolean "falsch" durch. Falsch, weil <b>keine Fehler</b> passiert sind.
Damit ist sofort einleuchtend, warum der folgende Kode:
echo "if(0) is ";
/* The integer 0 is casted to false. */
if(0){
echo "true";
} else {
echo "false";
}
"false" ausgibt.
Das Zeichen '0'
Besonders bei Internetanwendungen liegen jedoch oft Zeichenketten aus Benutzereingaben vor. Selbst wenn der Benutzer eine Anzahl eingeben soll wird letztendlich Text aus dem Formular an das PHP-Skript abgeschickt. Dabei scheitert ein Eingabeüberprüfungsversuch mittels empty() oder auch einem einfachen if($_POST['Anzahl']) bei der 0. Der Grund ist, dass der String '0' zu der Zahl 0 wird und damit .. sie wissen schon.
Damit wird klar - wenn auch weniger intuitiv -, dass der Kode:
echo "foo test: \n";
/* The string '0' is casted to the int 0 that is casted to the boolean false too. */
echo "if('0') is ";
if('0'){
echo "true";
} else {
echo "false";
}
wieder "false" ausgibt.
die wahren Werte
Nahezu "alles andere" ergibt "true". Der boolsche Wert "true", also wahr, steht für eine andere Zahl als 0 oder ein beliebiges anderes Zeichen als '0':
/* Everything other than the integer 0 or the char '0' is true. */
echo "if('1' && 23 && -3 && 'abcdef' && ':' && '?') is ";
if('1' && 23 && -3 && 'abcdef' && ':' && '?'){
echo "true(X)";
} else {
echo "false";
}
0 wie Augen auf
Dies alles bedeutet im täglichen Pragmatismus bei 0 die innere Aufmerksamkeit stets ein wenig zu erhöhen. Wer wirklich wissen will, ob die Zahl 0 in ein Texteingabefeld bei einer Web-Anwendung eingegeben worden ist und nicht "gar nichts" sollte folgenden Kode verwenden:
$_POST['Anzahl'] = '0';
echo "if(\$_POST['Anzahl'] !== '') is ";
if($_POST['Anzahl'] !== ''){
echo "true(X)";
} else {
echo "false";
}
Test auf keine Eingabe
$_POST['Anzahl'] = '';
if($_POST['Anzahl'] !== ''){
echo "true";
} else {
echo "false(X)";
}
foo - das komplette Programm
Wer jetzt selbst noch ein bischen rumspielen möchte:
echo "foo test: \n";
/* The integer 0 is casted to false. */
echo "if(0) is ";
if(0){
echo "true";
} else {
echo "false(X)";
}
echo "\n\n";
/* The string '0' is casted to the int 0 that is casted to the boolean false too. */
echo "if('0') is ";
if('0'){
echo "true";
} else {
echo "false(X)";
}
echo "\n\n";
/* Everything other than the integer 0 or the char '0' is true. */
echo "if('1' && 23 && -3 && 'abcdef' && ':' && '?') is ";
if('1' && 23 && -3 && 'abcdef' && ':' && '?'){
echo "true(X)";
} else {
echo "false";
}
echo "\n\n";
echo "if('0' === '') is ";
if('0' === ''){
echo "true";
} else {
echo "false(X)";
}
echo "\n\n";
echo "\n\n";
/* Like the user puts in the number 0 in a form field. */
$_POST['Anzahl'] = '0';
echo "\$_POST['Anzahl'] = '0'";
echo "\n";
echo "if(\$_POST['Anzahl'] !== '') is ";
if($_POST['Anzahl'] !== ''){
echo "true(X)";
} else {
echo "false";
}
echo "\n\n";
/* Like the user puts in the nothing in a form field. */
echo "\$_POST['Anzahl'] = ''";
echo "\n";
$_POST['Anzahl'] = '';
echo "if(\$_POST['Anzahl'] !== '') is ";
if($_POST['Anzahl'] !== ''){
echo "true";
} else {
echo "false(X)";
}
Micha, 12 Nov 2005
