Интересно, как PHP обрабатывает внутреннее сравнение true/false.
Я понимаю, что true определяется как 1, а false - 0.
Когда я делаю if("a"){ echo "true";}
, это echos " true". Как PHP распознает "a" как 1?
Как работает true/false в PHP?
Ответ 1
Это описано в документации PHP для booleans и введите таблицы сравнения.
При преобразовании в boolean следующие значения считаются FALSE:
- сам boolean
FALSE
- целое число
0
(ноль) - float
0.0
(ноль) - пустая строка и строка
'0'
- массив с нулевыми элементами
- объект с нулевыми переменными-членами (только для PHP 4)
- специальный тип
NULL
(включая неустановленные переменные) - Объекты SimpleXML, созданные из пустых тегов
Каждое другое значение считается TRUE.
Ответ 2
Zero - false, отличное от нуля - true.
В php вы можете более точно проверить использование оператора ===
.
if (0==false)
echo "works"; // will echo works
if (0===false)
echo "works"; // will not echo anything
Ответ 3
Лучший оператор для строгой проверки -
if($foo === true){}
Таким образом, вы действительно проверяете, является ли его истинным, а не 1 или просто просто установленным.
Ответ 4
PHP использует слабую типизацию (которую он называет "жонглирование типа" ), что является плохой идеей (хотя это разговор в другое время). Когда вы пытаетесь использовать переменную в контексте, который требует логического, он преобразует любую вашу переменную в логическую, в соответствии с некоторыми в основном произвольными правилами, доступными здесь: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting
Ответ 5
думать о том, что оператор является унарной функцией: is_false(type value)
, которая возвращает true или false, в зависимости от конкретной реализации для определенного типа и значения. Рассмотрим, может ли оператор вызывать такую функцию неявно, через синтаксический сахар.
Другая возможность заключается в том, что тип имеет оператор cast, который неявно превращает тип в другой тип, в этом случае строка в Boolean.
PHP не раскрывает такие детали, но С++ позволяет перегрузку оператора, которая предоставляет мелкие детали реализации оператора.
Ответ 6
Поскольку я посещал эту страницу несколько раз, я решил опубликовать пример сравнительного теста.
Результаты:
"" -> false
"abc" -> true
0 -> false
0 -> false
0.1 -> true
1 -> true
1.1 -> true
25 -> true
null -> false
[] -> false
[1] -> true
object(stdClass) -> true
Код:
$objects = [
"",
"abc",
0,
0.0,
0.1,
1,
1.1,
25,
null,
[],
[1],
new stdClass(),
];
foreach ($objects as $obj) {
$state = "false";
if ($obj) {
$state = "true";
}
if (is_string($obj)) {
if (strlen($obj) == 0) {
$obj = "\"\"";
} else {
$obj = "\"{$obj}\"";
}
}
if (is_array($obj)) {
if (count($obj) == 0) {
$obj = "[]";
} else {
$obj = json_encode($obj);
}
}
if (is_null($obj)) {
$obj = "null";
}
if (is_object($obj)) {
$obj = "object(stdClass)";
}
echo str_pad((string)$obj, 5, " ") . " -> {$state}" . PHP_EOL;
}
Протестировано на Windows 10 64-bit, с использованием PHP 7.2.5.