Heute habe ich mit PHP gespielt und festgestellt, dass die Zeichenfolgenwerte "true" und "false" in einer Bedingung, beispielsweise unter Berücksichtigung der folgenden Funktion, nicht korrekt auf Boolesche Werte analysiert werden:
function isBoolean($value) {
if ($value) {
return true;
} else {
return false;
}
}
Wenn ich ausführe:
isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false
Es scheint nur mit den Werten "1" und "0" zu funktionieren:
isBoolean("1") // Returns true
isBoolean("0") // Returns false
Gibt es in PHP eine native Funktion, um "wahre" und "falsche" Zeichenfolgen in Boolesche Werte zu analysieren?
isBoolean("")
false zurückgeben.true
obwohl es für einen menschlichen Leser intuitiver erscheint, als es bedeuteteFALSE
.Antworten:
Hierfür gibt es eine native PHP-Methode, die die filter_var-Methode von PHP verwendet:
Laut PHP-Handbuch :
quelle
FILTER_NULL_ON_FAILURE
derfilter_var()
Funktion das Flag hinzufügen und es NICHT durch das ersetzen müssen,FILTER_VALIDATE_BOOLEAN
wie ich dachte. Dies wird zu dem folgenden Code führen, der den Trick für mich$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Der Grund dafür ist, dass alle Zeichenfolgen
true
bei der Konvertierung in Boolesche Werte ausgewertet werden , mit Ausnahme von"0"
und""
(leere Zeichenfolge).Die folgende Funktion macht genau das, was Sie wollen: Sie verhält sich genau wie PHP, wertet den String aber auch aus
"false"
alsfalse
:In der Dokumentation wird Folgendes erläutert: http://php.net/manual/en/language.types.boolean.php :
quelle
Nur in PHP
"0"
oder die leere Zeichenfolge zwingen zu false; Jede andere nicht leere Zeichenfolge wird zu true gezwungen. Aus dem Handbuch :Sie benötigen eine eigene Funktion zu schreiben , die Saiten zu behandeln
"true"
vs"false"
. Hier gehe ich davon aus, dass alles andere standardmäßig false ist:Nebenbei bemerkt, das könnte leicht verdichtet werden
quelle
Ich brauchte kürzlich eine "lose" boolesche Konvertierungsfunktion, um Zeichenfolgen wie die zu behandeln, nach denen Sie fragen (unter anderem). Ich fand ein paar verschiedene Ansätze und fand einen großen Satz von Testdaten, um sie durchzugehen . Da nichts meinen Bedürfnissen entsprach, schrieb ich mein eigenes:
Beachten Sie, dass bei Objekten, die sowohl zählbar als auch von Zeichenfolgen umwandelbar sind, die Anzahl gegenüber dem Zeichenfolgenwert bevorzugt wird, um die Wahrhaftigkeit zu bestimmen. Das heißt, wenn
$object instanceof Countable
dies(boolean) count($object)
unabhängig vom Wert von zurückgegeben wird(string) $object
.Sie können das Verhalten für die von mir verwendeten Testdaten sowie die Ergebnisse für mehrere andere Funktionen hier sehen . Es ist schwierig, die Ergebnisse dieses kleinen Iframes zu überfliegen, sodass Sie die Skriptausgabe stattdessen auf einer ganzen Seite anzeigen können (diese URL ist nicht dokumentiert, sodass dies möglicherweise nicht für immer funktioniert). Für den Fall, dass diese Links eines Tages sterben, stelle ich den Code auch auf Pastebin .
Die Grenze zwischen dem, was "wahr sein sollte" und dem, was nicht sein sollte, ist ziemlich willkürlich; Die von mir verwendeten Daten sind nach meinen Bedürfnissen und ästhetischen Vorlieben kategorisiert. Ihre Daten können abweichen.
quelle
Ich verwende dieses Konstrukt, um Zeichenfolgen in Boolesche
true
Werte umzuwandeln, da Sie für die meisten anderen Werte Folgendes wünschen :quelle
Nein - beide sind Zeichenfolgen, und beide bewerten (wie Sie sagen)
true
.false
In PHP werden nur leere Zeichenfolgen ausgewertet .Sie müssten dies manuell testen. Wenn es überhaupt möglich ist, ist es besser, stattdessen mit "echten" booleschen Werten zu arbeiten.
quelle
true
in PHP ausgewertet .true
]" kann einem Neuling den falschen Eindruck vermitteln, insbesondere einer aus einer anderen Sprache mit strengeren Tippregeln, bei der eine Zeichenfolge eine Zeichenfolge ist und der Inhalt keine Rolle spielt, wenn er in einen Booleschen Wert konvertiert wird (z Rubin)."0"
? Wird das nicht auch ausgewertetfalse
?Einfachste Möglichkeit, sicher in einen Booleschen Wert zu konvertieren;
quelle
Wenn Ihre API nur die Zeichenfolgen "true" oder "false" akzeptiert und alles andere wird
null
, versuchen Sie Folgendes:Dies setzt voraus, dass dies
$input
kein Objekt ist. Null coalesce (??
) wurde in PHP 7.0 eingeführt.quelle