Подтвердить что ты не робот

Как работает true/false в PHP?

Интересно, как PHP обрабатывает внутреннее сравнение true/false. Я понимаю, что true определяется как 1, а false - 0. Когда я делаю if("a"){ echo "true";}, это echos " true". Как PHP распознает "a" как 1?

4b9b3361

Ответ 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.