Dzisiaj bawiłem się w PHP i odkryłem, że wartości ciągów „true” i „false” nie są poprawnie przetwarzane na wartości logiczne w warunku, na przykład biorąc pod uwagę następującą funkcję:
function isBoolean($value) {
if ($value) {
return true;
} else {
return false;
}
}
Jeśli wykonam:
isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false
Wydaje się, że działa tylko z wartościami „1” i „0”:
isBoolean("1") // Returns true
isBoolean("0") // Returns false
Czy w PHP istnieje natywna funkcja przetwarzająca ciągi „prawda” i „fałsz” na wartość logiczną?
isBoolean("")
powinno zwrócić false.true
tak, chociaż dla ludzkiego czytelnika wydawałoby się to bardziej intuicyjne, niż to oznaczałoFALSE
.Odpowiedzi:
Jest to natywna metoda PHP, która wykorzystuje metodę filter_var PHP:
Zgodnie z instrukcją PHP :
źródło
FILTER_NULL_ON_FAILURE
dofilter_var()
funkcji i NIE zastępować jejFILTER_VALIDATE_BOOLEAN
tak, jak myślałem. W rezultacie otrzymam następujący kod, który$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Powodem jest to, że wszystkie ciągi są
true
przeliczane na wartości logiczne, z wyjątkiem"0"
i""
(pusty ciąg).Następująca funkcja zrobi dokładnie to, co chcesz: zachowuje się dokładnie tak jak PHP, ale ocenia również ciąg
"false"
jakofalse
:Dokumentacja wyjaśnia, że: http://php.net/manual/en/language.types.boolean.php :
źródło
Tylko w PHP
"0"
lub pusty napis wymusza fałsz; każdy inny niepusty łańcuch wymusza wartość true. Z instrukcji :Musisz napisać własną funkcję do obsługi ciągów
"true"
vs"false"
. Tutaj zakładam, że wszystko inne jest domyślnie fałszywe:Na marginesie, do którego można łatwo skondensować
źródło
Niedawno potrzebowałem „luźnej” funkcji konwersji wartości boolowskiej do obsługi łańcuchów, takich jak te, o które pytasz (między innymi). Znalazłem kilka różnych podejść i wymyśliłem duży zestaw danych testowych, aby je przejrzeć . Nic nie pasowało do moich potrzeb, więc napisałem własne:
Zauważ, że w przypadku obiektów, które są zarówno policzalne, jak i rzucane na łańcuchy, będzie to faworyzować liczenie względem wartości ciągu w celu określenia prawdziwości. Oznacza to, że jeśli
$object instanceof Countable
zwróci to(boolean) count($object)
niezależnie od wartości(string) $object
.Możesz zobaczyć zachowanie danych testowych, których użyłem, a także wyniki dla kilku innych funkcji tutaj . Trudno jest przejrzeć wyniki z tego małego elementu iframe, więc zamiast tego można wyświetlić wynik skryptu na pełnej stronie (ten adres URL jest nieudokumentowany, więc może to nie działać wiecznie). Na wypadek, gdyby te linki pewnego dnia umarły, umieściłem kod również na pastebinie .
Granica między tym, co „powinno być prawdą”, a tym, co nie powinno, jest dość arbitralna; dane, których użyłem, są kategoryzowane w oparciu o moje potrzeby i preferencje estetyczne, Twoje mogą się różnić.
źródło
Używam tej konstrukcji do przekształcania ciągów znaków w wartości logiczne, ponieważ w
true
przypadku większości innych wartości chcesz :źródło
Nie - oba są łańcuchami i oba (jak mówisz) obliczają
true
.false
W PHP obliczane są tylko puste łańcuchy .Musisz to sprawdzić ręcznie. Jeśli to w ogóle możliwe, lepiej byłoby zamiast tego pracować z „prawdziwymi” wartościami boolowskimi.
źródło
true
W PHP nie wszystkie łańcuchy są oceniane na .true
]” może dać nowicjuszowi niewłaściwe wrażenie, szczególnie w innym języku z bardziej rygorystycznymi regułami pisania, w których ciąg jest łańcuchem, a zawartość nie ma znaczenia, gdy jest konwertowany na wartość logiczną (np. Rubin)."0"
? Czy to również nie dajefalse
?Najłatwiejszy sposób na bezpieczną konwersję na wartość logiczną;
źródło
Jeśli Twój interfejs API akceptuje tylko ciągi „prawda” lub „fałsz”, a wszystko inne staje się inne
null
, spróbuj:Zakłada się, że
$input
nie jest to przedmiot. Null coalesce (??
) została wprowadzona w PHP 7.0.źródło