In PHP ist setType () eine sehr bequeme Konvertierungsfunktion, die den Typ einer Variablen in situ ändern kann. Wenn wir jedoch setType () verwenden, um einen Wert in einen Booleschen Typ ( BOOL ) umzuwandeln, können wir einige Probleme stoßen, die leicht zu ignorieren sind, aber einen großen Einfluss haben, insbesondere wenn wir uns mit Benutzereingaben oder externen Daten befassen.
Dieser Artikel konzentriert sich auf das Verhalten von SetType ($ var, 'bool') und analysiert mögliche Missverständnisse und Vorsichtsmaßnahmen.
Schauen wir uns zunächst ein grundlegendes Beispiel an:
$var = 1;
settype($var, 'bool'); // Jetzt $var Ja true
Dies ist intuitiv: Unzero-Zahlen werden in True konvertiert und 0 in False konvertiert. In ähnlicher Weise werden nicht leere Saiten wahr und leere Saiten werden falsch :
$var = 'hello';
settype($var, 'bool'); // true
$var = '';
settype($var, 'bool'); // false
Auf den ersten Blick scheint alles vernünftig zu sein, aber das Problem ist in diesen "vernünftigen" genau verborgen.
Eine der verwirrendsten Situationen ist:
$var = 'false';
settype($var, 'bool'); // 结果Ja true
Viele Anfänger oder Personen, die aus anderen Sprachen übertragen wurden (wie JavaScript, Java), sind anfällig zu der Annahme, dass die Zeichenfolge "Falsch" dem booleschen Wert falsch entsprechen sollte, aber in PHP, solange die Zeichenfolge nicht leer ist, ist sie wahr . Dies ist eine typische Falle.
Besonders bei der Verarbeitungsformulareingabe:
$input = $_POST['subscribe']; // Der Benutzer hat möglicherweise übermittelt "false"
settype($input, 'bool');
Zu diesem Zeitpunkt wird $ Input tatsächlich in True konvertiert, da es sich um eine nicht leere Zeichenfolge handelt. Dies kann zu logischen Beurteilungsfehlern führen.
Eine andere Sache, die leicht übersehen wird, sind Arrays und Objekte:
$var = [];
settype($var, 'bool'); // false
$var = [1];
settype($var, 'bool'); // true
Ein leeres Array ist falsch , aber selbst wenn es nur ein Element gibt, ist es wahr . Dies kann beim Durchqueren oder Überprüfen von Daten zu einem Fehleinschätzung führen.
In ähnlicher Weise ist ein Objekt immer wahr , auch wenn es keine Eigenschaften im Objekt gibt:
$var = new stdClass();
settype($var, 'bool'); // true
Wenn die Variable null ist, wandelt sich setType () in false um, was ebenso wie erwartet ist:
$var = null;
settype($var, 'bool'); // false
Es ist jedoch zu beachten, dass die Kombination von ISSET () und SETTYPE () die Typprüfung nicht ersetzen kann. Zum Beispiel schreiben Sie Folgendes:
if (isset($_GET['active'])) {
$active = $_GET['active'];
settype($active, 'bool');
}
Wenn $ _get ['active'] '0' ist (d. H. Eine Zeichenfolge), wird es in true konvertiert, weil '0' eine nicht leere Zeichenfolge ist. Die richtige Art, es explizit zu machen:
$active = isset($_GET['active']) && $_GET['active'] === '1';
Oder basierend auf dem Kontext einen sichereren Analyse, z.
Das Mischen von setType () mit if ($ var) kann dazu führen, dass Code -Semantik verwischt wird. Zum Beispiel:
$val = $_GET['debug'] ?? '';
settype($val, 'bool');
if ($val) {
// Schalten Sie den Debug -Modus ein
}
Dieser Code sieht auf der Oberfläche direkt aus, aber es ist tatsächlich schwer zu pflegen und zu lesen. Es ist besser, einen expliziten Whitelist zu verwenden:
$debug = in_array($_GET['debug'] ?? '', ['1', 'true'], true);
Dies ist klarer, kontrollierbar und sicherer.
Beim Umgang mit booleschen Conversions, insbesondere mit Eingaben von Benutzern oder URLs, wird empfohlen, Einstellungen () zu vermeiden. Erwägen Sie, eine explizitere Beurteilungslogik zu verwenden oder eine Transformationsfunktion zu verringern:
function toBool($value): bool {
$truthy = ['1', 1, true, 'true', 'on', 'yes'];
return in_array(strtolower((string)$value), $truthy, true);
}
Dann verwenden Sie:
$flag = toBool($_GET['flag'] ?? '');
Dies kann besser Fehleinschätzungen verhindern und die Wartbarkeit und Vorhersehbarkeit des Codes verbessern.
setType () scheint in PHP einfach zu sein, aber es ist leicht, ein unerwartetes Verhalten bei der Konvertierung von booleschen Werten zu verursachen. Häufige Fragen umfassen:
Die Zeichenfolge "False" wird in true konvertiert
Der Verhaltensunterschied zwischen leerer Zeichenfolge und '0'
Die Standard-Booleschen Werte von Arrays und Objekten sind nicht intuitiv
Es ist einfach, logische Schwachstellen zu verursachen, wenn sie mit Benutzereingaben zusammenarbeiten
Daher wird empfohlen, setType () mit Vorsicht vor Booleschen Transformation zu verwenden, insbesondere wenn die Daten von außen verarbeitet werden, ein explizite Urteil oder die Kapselung sichererer Funktionen zur Verbesserung der Code -Robustheit verwendet werden sollten.
Um einen bestimmten Code für diese Situationen zu demonstrieren oder ein Testwerkzeug zu erstellen, können Sie sich unter https://gitbox.net/tools/php-booltest beziehen.