0 ist gleich String???

ThiKool

Erfahrenes Mitglied
Hi Leute,

ich habe gerade etwas sehr seltsames in meinem Code entdeckt - aber seht selbst:

Code:
$css=0;
if($css == "testButton"){
    echo "DEBUG"; 
    }

Warum wird hier bei mir DEBUG ausgegeben??? $css ist 0 und definitiv nicht "testButton".

Hab ich irgend etwas verstellt, oder seh ich den offensichtlichen Fehler nur gerade nicht?

Danke euch
 
Eine Gegenfrage aus eigener Erfahrung.
Bist du sicher, dass du nirgends anders noch ein echo DEBUG drin hast?
 
Du nutzt loose comparisons ("==" im Vergleich zu "==="). Die sind nicht typsicher, sondern wandeln Datentypen gegebenenfalls um. Für <int> == <string> wird zum Beispiel der String in einen Integer umgewandelt, um einen Vergleich auf Zahlenebene machen zu können. In PHP ist zum Beispiel 13 == "13".

Das passiert auch in deinem Code. Und "testButton" als Integer ist dann eben 0.

- http://php.net/manual/en/types.comparisons.php

PHP:
$css = 0;
if ($css === "testButton") {
    echo "DEBUG";
}
 
Ok, danke, dass mit den === ist mir bekannt allerdings ist mir das noch nie aufgefallen das PHP so reagiert und dachte PHP erkennt das oder erkannte das immer, desshalb bin ich jetzt so verwirrt.

Hat sich diesbezüglich etwas geändert? Aber ich habe ja eigentlich auch nichts verstellt oder die PHP Version geändert.
 
Du hast wahrscheinlich sonst nie Strings mit int(0) verglichen. PHP wandelt den String nur in eine Zahl um, wenn die andere Seite des Vergleichs ein Integer (oder ein Float) ist.

PHP:
var_dump("test" == "0"); // false (string == string, keine Umwandlung)
var_dump("test" == 1);   // false (string == int, vergleicht als 0 == 1)
var_dump("test" == 0);   // true (string == int, vergleicht als 0 == 0)
var_dump("1test" == 0);  // false (string == int, vergleicht als 1 == 0)
var_dump("1test" == 1);  // true (string == int, vergleicht als 1 == 1)

Geändert hat sich da meines Wissens seit ewigen Zeiten nichts.
 
Ok, vielen Dank, ich war nur extrem verwirrt gestern, da mir das noch nie aufgefallen ist oder Probleme gemacht hatte.
 
Weil das alles etwas kompliziert oder unintuitiv sein kann, empfiehlt es sich eben, möglichst auf "===", also typsichere Vergleiche, zu setzen. Du musst da nur darauf achten, dass du numerische Eingaben, die als Strings übermittelt werden (etwa in $_POST oder $_GET, aus Dateien oder aus externen Datenquellen oder je nachdem auch Datenbanken), dann in den passenden Datentyp castest.

Das mag zwar auf den ersten Blick auf andere Weise unhandlich oder fehleranfällig sein (wenn man es vergisst, geht ein Teil der Anwendung „grundlos“ nicht mehr), aber der Teufel steckt eben immer im Detail.
 

Neue Beiträge

Zurück