PHP-Vergleich-Fehler
Heute, Ich schrieb ein Skript in PHP beim stieß ich auf unerwartetes Verhalten in der Befehlszeile verwendet werden (zumindest von meiner Seite).
Das Skript sollte drei Argumente erhalten., das letzte von ihnen eine Liste mit einem oder mehreren numerischen Codes.
Versuch, diese letzte Argument zu überprüfen war ein anderes Ergebnis bekommen als gedacht.
Finden Sie das Code-Snippet, das war ich mit:
// test.php if (php_sapi_name() == 'Cli') { $di = Isset($argv[1]) ? $argv[1] : Datum('Y-m-d'); // Initial Date $df = isset($argv[2]) ? $argv[2] : Datum('Y-m-d'); // Final Date $prods = isset($argv[3]) ? explodieren(',', $argv[3]) : Array(); // Codeliste ##### Überprüfen von // Initial Date if ($di != Datum('Y-m-d', strtotime($di))) { Echo "\n"; Echo "FEHLER! Ungültige Fixierung!\n"; Ausfahrt; } // Final Date if ($DF != Datum('Y-m-d', strtotime($DF))) { Echo "\n"; Echo "ERRO! Ungültiges Datum endgültig!\n"; Ausfahrt; } // Codes if (Graf($Viehtreiber) > 0) { foreach ($prods als $prod) { if ($Prod != (int)$Prod) { Echo "\n"; Echo "FEHLER! Der CODE " . $Prod . " ist ungültig!\n" ; Ausfahrt; } } } Echo "FERTIG!"; }
Interessant ist, Wenn ich lief
# Php -f test.php 2015-12-10 2015-12-11 33b
Das Ergebnis war
# FERTIG
and reversing the condition to
if ($Prod == (int)$Prod)
die erwartete Meldung anzeigen.
Ich versuchte eine separate Variable zuweisen und noch weiter funktioniert nicht.
$Überprüfen Sie = (int) $Prod; if ($Prod !$check =) {
Whyyy??
Der Typvergleich
!==
cannot be used here, Da alle Argumente Zeichenfolgen werden. Wenn ich aber über diese bekam ich die Antwort.
So I did some command line tests and I check for the actually behavior of PHP Comparisons.
Wenn wir Dinge wie zu tun:
$Zeichenfolge == $integer
PHP will always do a CAST from String to the other type before comparison, also der Code
$Zeichenfolge == (int) $Zeichenfolge
will always return true, seit $Zeichenfolge wird geändert in int in both sides.
Zu dieser Art von Schwierigkeiten zu vermeiden, is necessary to have the same type in both sides of comparison.
$Conf = (int) $Prod;
if ($Prod != (Zeichenfolge) $conf) {
// OR
if ($Prod != (Zeichenfolge)(int)$Prod) {
Bis bald.