Сегодня я играл с PHP и обнаружил, что строковые значения «истина» и «ложь» неправильно преобразованы в логические значения в условии, например, учитывая следующую функцию:
function isBoolean($value) {
if ($value) {
return true;
} else {
return false;
}
}
Если я выполню:
isBoolean("true") // Returns true
isBoolean("") // Returns false
isBoolean("false") // Returns true, instead of false
isBoolean("asd") // Returns true, instead of false
Это работает только со значениями «1» и «0»:
isBoolean("1") // Returns true
isBoolean("0") // Returns false
Есть ли в PHP встроенная функция для преобразования строк «истина» и «ложь» в логические значения?
isBoolean("")
должно возвращаться false.true
даже если человеческому читателю оно показалось бы более интуитивным, чем оно означалоFALSE
.Ответы:
Для этого существует собственный PHP-метод, который использует PHP-метод filter_var:
Согласно руководству PHP :
источник
FILTER_NULL_ON_FAILURE
кfilter_var()
функции, а НЕ заменять его,FILTER_VALIDATE_BOOLEAN
как я думал. Это приведет к следующему коду, который$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)
Причина в том, что
true
при преобразовании в логическое значение все строки оцениваются как, кроме"0"
и""
(пустая строка).Следующая функция будет делать именно то, что вы хотите: она ведет себя точно так же, как PHP, но также оценивает строку
"false"
какfalse
:В документации поясняется следующее: http://php.net/manual/en/language.types.boolean.php :
источник
Только в PHP
"0"
или принуждение пустой строки к false; каждая другая непустая строка приводится к истине. Из руководства :Вы должны написать свою собственную функцию для обработки строк
"true"
против"false"
. Здесь я предполагаю, что все остальное по умолчанию равно false:На стороне примечания, которое можно легко сжать до
источник
Недавно мне понадобилась «свободная» функция логического преобразования для обработки строк, подобных тем, о которых вы спрашиваете (среди прочего). Я нашел несколько разных подходов и придумал большой набор тестовых данных для их обработки . Ничего не подходило под мои нужды, поэтому я написал свое:
Обратите внимание, что для объектов, которые являются как счетными, так и строковыми, это предпочтет счетчику над строковым значением для определения истинности. То есть, если
$object instanceof Countable
это вернется(boolean) count($object)
независимо от значения(string) $object
.Вы можете увидеть поведение для тестовых данных , которые я использовал, а также результаты для ряда других функций здесь . Трудно просмотреть результаты этого маленького iframe, поэтому вместо этого вы можете просматривать вывод скрипта на полной странице (этот URL-адрес недокументирован, поэтому это может не работать вечно). На тот случай, если эти ссылки когда-нибудь умрут, я также помещаю код на pastebin .
Граница между тем, что «должно быть правдой» и что не должно, довольно условна; данные, которые я использовал, сгруппированы в зависимости от моих потребностей и эстетических предпочтений, ваши могут отличаться.
источник
Я использую эту конструкцию для преобразования строк в логические значения, так как вы хотите
true
для большинства других значений:источник
Нет - оба являются строками, и оба (как вы говорите) оценивают
true
. Вfalse
PHP оцениваются только пустые строки .Вам нужно будет проверить это вручную. Однако, если это вообще возможно, было бы лучше работать с «настоящими» логическими значениями.
источник
true
в PHP.true
]» может создать у новичка неверное впечатление, особенно если речь идет о другом языке с более строгими правилами ввода, где строка является строкой, а содержимое не имеет значения, когда оно преобразуется в логическое значение (например, Рубин)."0"
? Разве это тоже не оцениваетсяfalse
?Самый простой способ безопасно преобразовать в логическое значение;
источник
Если ваш API принимает только строки «истина» или «ложь», а все остальное становится
null
, попробуйте:Это предполагает, что
$input
это не объект. Null coalesce (??
) был представлен в PHP 7.0.источник