‚Lorem ipsum‘ == 0

Das ist eigentlich ein alter Hut, dennoch ist das Problem zuletzt bei meiner Programmierarbeit aufgeschlagen.

TL;DR

  • PHP parsed Strings recht „naiv“ auf Integers
  • z.b. ist ein Text, der nicht mit einer Ziffer > 0 beginnt stets gleich 0
  • im Programmierkontext kann das irreführend sein

Strings sind keine Integers, oder doch?

Ich wollte prüfen, ob in einer Variable der String ‚xxx‘ steht. Tatsächlich war die Variable mit dem Integer 0 initialisiert, was zu irreführendem Verhalten führte.

/*$var ist bereits irgendwie initialisiert, ansonsten wird $var auf 0 gesetzt*/
$var = $var ?? 0;

if ($var == 'xxx') {
    echo 'Der Variablenwert ist ein String';
} else {
    echo 'Der Variablenwert ist ein Integer';
}

Der obenstehende Code wird, sofern $var nicht zuvor initialisiert wurde, immer ‚Der Variablenwert ist ein String‘ ausgeben. Dies liegt am automatischen String parsing von PHP, welches versucht, einen String auf Biegen und Brechen in einen Integer zu wandeln, falls notwendig. Da ‚xxx‘ mit keinerlei Ziffer beginnt ist dieser String stets gleich 0. Anders verhält es sich mit ‚1xxx‘, welcher bei einer Berechnung wie eine 1 gehandhabt wird. Sehr gut wird dieses Verhalten in diesem Beitrag erläutert.

Vorgebeugt kann dieses vermeintliche Fehlverhalten mit einer Prüfung auf Identität bzw. dem Tripple-Equals-Operator (===). Bedenke: wie oben Beschrieben ist 0 == ‚xxx‘!

echo (0 == 'xxx'); // output - true, da auch 0 == '0' true ist
echo (0 === 'xxx'); // output - false, da auch 0 === '0' false ist