1. Einleitung
Die Konvertierung von String zu Boolean kann in PHP über „$string = (boolean)$string;” durchgeführt werden. Diese Umwandlung hat allerdings ihre Tücken, denn sie macht aus fast jedem String ein (bool)true. Einzig (string)"0" und (string)"" (also der leere String) werden als (bool)false interpretiert. Sämtliche anderen Möglichkeiten — einschließlich (string)"false", (string)"null", (string)"no" und ähnliche — ergeben (bool)true. Das nachfolgende Beispiel verdeutlicht dies:
<?php echo '"true":'."\n"; var_dump((boolean)'true'); echo '"false":'."\n"; var_dump((boolean)'false'); echo '"1":'."\n"; var_dump((boolean)'1'); echo '"0":'."\n"; var_dump((boolean)'0'); echo '"meow":'."\n"; var_dump((boolean)'meow'); echo '"":'."\n"; var_dump((boolean)''); ?>
"true": bool(true) "false": bool(true) "1": bool(true) "0": bool(false) "meow": bool(true) "": bool(false)
Aufgrund dieser unpassenden Konvertierung ist es empfehlenswert, diese nicht über (boolean)$string durchzuführen, sondern sie abhängig vom Kontext selbst vorzunehmen. Dabei sollte gezielt auf bestimmte Strings (z. B. "ja" und "nein") geprüft werden.
2. Beispiel: Gezieltes prüfen
Dieses Beispiel enthält eine kurze Funktion, welche den übergebenen String $str untersucht und nur dann (bool)true zurückgibt, wenn dieser exakt (string)"true" oder (string)"1" enthält. Andernfalls wird immer (bool)false zurückgegeben.
<?php function strToBool($str) { return ($str==='true' || $str==='1' ? true : false); } echo '"true":'."\n"; var_dump(strToBool('true')); echo '"false":'."\n"; var_dump(strToBool('false')); echo '"1":'."\n"; var_dump(strToBool('1')); echo '"0":'."\n"; var_dump(strToBool('0')); echo '"meow":'."\n"; var_dump(strToBool('meow')); echo '"":'."\n"; var_dump(strToBool('')); ?>
"true": bool(true) "false": bool(false) "1": bool(true) "0": bool(false) "meow": bool(false) "": bool(false)
3. Beispiel: Flexible exakte Prüfung
In diesem Beispiel wird die vorherige Funktion etwas flexibler gestaltet. Anstatt nur bestimmte, fest definierte Werte als (bool)true zu interpretieren, kann diesmal ein Array von erlaubten Strings übergeben werden, welche als (bool)true aufgefasst werden sollen. Die Strings in dem Array sollten klein geschrieben sein. Ist der übergebene String $str nicht im Array enthalten, dann wird weiterhin (bool)false zurückgegeben. Wird kein Array von erlaubten Strings übergeben, dann wird ein Standardarray verwendet, welches "true", "yes", "1", "1.0" und "ok" als (bool)true interpretiert.
<?php function strToBool($str, $trueArr=null) { $trueArr = (!is_array($trueArr) ? array('true', 'yes', '1', '1.0', 'ok') : $trueArr); return (in_array(mb_strtolower($str), $trueArr, true) ? true : false); } echo '"true":'."\n"; var_dump(strToBool('true')); echo '"false":'."\n"; var_dump(strToBool('false')); echo '"1":'."\n"; var_dump(strToBool('1')); echo '"0":'."\n"; var_dump(strToBool('0')); echo '"meow":'."\n"; var_dump(strToBool('meow', array('meow'))); echo '"":'."\n"; var_dump(strToBool('')); ?>
"true": bool(true) "false": bool(false) "1": bool(true) "0": bool(false) "meow": bool(true) "": bool(false)
4. Konvertierung mit Exception
In diesem Beispiel wird demonstriert, wie eine Exception immer dann geworfen werden kann, wenn der im übergebenen String enthaltene Wert unbekannt ist. Hier werden nur (string)"true" und (string)"false" als bekannt interpretiert. Bei allen anderen Werten wird eine Exception erzeugt. Ein solches Vorgehen schützt vor unerwarteten Konvertierungen, die zu schwer zu identifizierenden und daher ebenso schwer zu behebenden Bugs führen können.
<?php function strToBool($str) { if ($str === 'true') { return true; } else if ($str === 'false') { return false; } else { throw new Exception('Cannot convert string to boolean, expected string "true" or "false".'); } } try { echo '"true":'."\n"; var_dump(strToBool('true')); echo '"false":'."\n"; var_dump(strToBool('false')); echo '"1":'."\n"; var_dump(strToBool('1')); echo '"0":'."\n"; var_dump(strToBool('0')); echo '"meow":'."\n"; var_dump(strToBool('meow')); echo '"":'."\n"; var_dump(strToBool('')); } catch (Exception $e) { echo "Exception in line {$e->getLine()} with message: {$e->getMessage()}"; } ?>
"true": bool(true) "false": bool(false) "1": Exception in line 8 with message: Cannot convert string to boolean, expected string "true" or "false".