Как работает true / false в PHP? - PullRequest
46 голосов
/ 04 марта 2010

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

Ответы [ 6 ]

90 голосов
/ 04 марта 2010

Это описано в документации PHP для логических и таблиц сравнения типов .

При преобразовании в логические значения следующие значения считаются ЛОЖНЫМИ:

  • логическое значение FALSE само по себе
  • целое число 0 (ноль)
  • число с плавающей точкой 0.0 (ноль)
  • пустая строка, строка '0'
  • массив с нулевыми элементами
  • объект с нулевыми переменными-членами (только PHP 4)
  • специальный тип NULL (включая неустановленные переменные)
  • Объекты SimpleXML, созданные из пустых тегов

Любое другое значение считается ИСТИНА .

5 голосов
/ 04 марта 2010

Ноль - это ложь, ненулевое - это правда.

В php вы можете протестировать более явно, используя оператор ===.

if (0==false) 
    echo "works"; // will echo works

if (0===false) 
    echo "works"; // will not echo anything
3 голосов
/ 05 марта 2010

Лучшим оператором для строгой проверки является

if($foo === true){}

Таким образом, вы действительно проверяете, является ли оно истинным, а не 1 или просто установлено.

2 голосов
/ 23 января 2019

Поскольку я посетил эту страницу несколько раз, я решил опубликовать пример сравнительного теста.

Результаты:

""    -> 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;
}

Протестировано на 64-битной Windows 10 с использованием PHP 7.2.5.

1 голос
/ 04 марта 2010

PHP использует слабую типизацию (которую он называет «жонглированием типов»), что является плохой идеей (хотя это разговор в другой раз). Когда вы пытаетесь использовать переменную в контексте, который требует логического значения, она преобразует любую вашу переменную в логическое значение в соответствии с некоторыми в основном произвольными правилами, доступными здесь: http://www.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting

0 голосов
/ 04 марта 2010

оператор воспринимается как унарная функция: is_false(type value), которая возвращает true или false, в зависимости от точной реализации для конкретного типа и значения. Рассмотрим оператор if для неявного вызова такой функции через синтаксический сахар.

Другая возможность состоит в том, что у типа есть оператор приведения, который неявно преобразует тип в другой тип, в данном случае это строка с логическим значением.

PHP не предоставляет таких подробностей, но C ++ допускает перегрузку операторов, что раскрывает тонкие детали реализации операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...