Сегодня я играл с PHP, и я обнаружил, что строковые значения «true» и «false» неправильно обрабатываются в boolean в условии, например, рассматривая следующую функцию:
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 для синтаксического анализа строк «true» и «false» в boolean?
Существует собственный PHP-метод, который использует метод filter_var PHP:
$bool = filter_var($value, FILTER_VALIDATE_BOOLEAN);
Согласно руководству PHP:
Возвращает TRUE для «1», «true», «on» и «yes». Возвращает FALSE в противном случае.
Если FILTER_NULL_ON_FAILURE установлен, FALSE возвращается только для «0», «false», «off», «no» и «», а NULL возвращается для всех небулевых значений.
Причина в том, что все строки оценивают true
при преобразовании их в boolean, кроме "0"
и ""
(пустая строка).
Следующая функция будет делать именно то, что вы хотите: она ведет себя точно так же, как PHP, но также будет оценивать строку "false"
как false
:
function isBoolean($value) { if ($value && strtolower($value) !== "false") { return true; } else { return false; } }
В документации объясняется, что: http://php.net/manual/en/language.types.boolean.php :
При преобразовании в boolean следующие значения считаются FALSE:
- сама логическая ЛОЖЬ
- целое число 0 (ноль)
- поплавок 0.0 (ноль)
- пустая строка и строка «0»,
- массив с нулевыми элементами
- специальный тип NULL (включая неустановленные переменные)
- Объекты SimpleXML, созданные из пустых тегов
Каждое другое значение считается TRUE (включая любой ресурс).
В PHP только "0"
или пустая строка принуждения к false; каждая другая непустая строка приводит к истинному. Из руководства :
При преобразовании в boolean следующие значения считаются
FALSE
:
- пустая строка и строка «0»,
Вам нужно написать свою собственную функцию для обработки строк "true"
vs "false"
. Здесь я предполагаю, что все остальное по умолчанию имеет значение false:
function isBoolean($value) { if ($value === "true") { return true; } else { return false; } }
На стороне примечание, которое можно легко свести к
function isBoolean($value) { return $value === "true"; }
Я использую эту конструкцию для преобразования строк в логические значения, поскольку для большинства других значений вы хотите true
:
$str = "true"; $bool = !in_array($str, array("false", "", "0", "no", "off"));
Недавно мне понадобилась «свободная» функция логического преобразования для обработки строк, подобных тем, о которых вы просите (между прочим). Я нашел несколько разных подходов и придумал большой набор тестовых данных для их запуска . Ничто не вполне соответствовало моим потребностям, поэтому я написал свои собственные:
function loosely_cast_to_boolean($value) { if(is_array($value) || $value instanceof Countable) { return (boolean) count($value); } else if(is_string($value) || is_object($value) && method_exists($value, '__toString')) { $value = (string) $value; // see http://www.php.net/manual/en/filter.filters.validate.php#108218 // see https://bugs.php.net/bug.php?id=49510 $filtered = filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE); if(!is_null($filtered)) { return $filtered; } else { // "none" gets special treatment to be consistent with ini file behavior. // see documentation in php.ini for more information, in part it says: // "An empty string can be denoted by simply not writing anything after // the equal sign, or by using the None keyword". if(strtolower($value) === 'none') { $value = ''; } return (boolean) $value; } } else { return (boolean) $value; } }
Обратите внимание, что для объектов, которые являются как счетными, так и строковыми, это будет способствовать подсчету над строковым значением для определения правдоподобия. То есть, если $object instanceof Countable
будет возвращать (boolean) count($object)
независимо от значения (string) $object
.
Вы можете увидеть поведение тестовых данных, которые я использовал, а также результаты для нескольких других функций здесь . Трудно скомпенсировать результаты с этого маленького iframe, так что вы можете просмотреть вывод сценария на полной странице (вместо этого этот URL недокументирован, так что это может не работать навсегда). В случае, если эти ссылки однажды умрут, я добавлю код на пастебин .
Линия между тем, что «должно быть истинным» и что не должно быть довольно произвольным; данные, которые я использовал, классифицируются на основе моих потребностей и эстетических предпочтений, ваши могут отличаться.
Есть ли функция в PHP для синтаксического анализа строк «true» и «false» в boolean?
Нет – обе строки, и те, и другие (как вы говорите), оцениваете true
. Только пустые строки оцениваются как false
в PHP.
Вам нужно будет проверить это вручную. Если это вообще возможно, было бы лучше работать с «реальными» булевыми значениями.
Самый простой способ безопасного преобразования в логическое;
$flag = 'true'; if( filter_var( $flag,FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE ) !== null) { $flag = filter_var($flag,FILTER_VALIDATE_BOOLEAN); } gettype($flag); // Would Return 'Boolean' echo 'Val: '.$flag; // Would Output 'Val: 1'