Вопрос по types, php – PHP Type-Cast Confusion

2

У меня есть следующий код:

<?php
    $val = 0;
    $res = $val == 'true';

    var_dump($res);
?>

У меня всегда было впечатление, что $ res должно быть 'false', так как в приведенном выше выражении PHP будет пытаться ввести cast $ val в логический тип (где ноль будет преобразован как false) и строку (непустая строка - true) , Но если я выполню код выше, вывод будет:

boolean true

Я что-то пропустил? Благодарность

Строка 'true', вероятно, немного сбивает с толку, вот еще один пример:<?php $val = 0; $res = $val == 'xxxxxx'; var_dump($res); ?> Все еще $ res -> правда. user1393876

Ваш Ответ

3   ответа
3

поэтому0 == 'true' ИСТИНА, но0 === 'true' ЛОЖНО. Струнаtrue не был приведен к логическому значению, но сравнивается какстрок в ноль. Ноль остается как значение типа int, а не как логическое значение. Итак, в конечном итоге вы получите:

// string 'true' casts to int 0
0 == 0 // true

Попробуй это

echo intval('true');
// 0
echo intval('some arbitrary non-numeric string');
// 0

Обзор таблица сравнения типов PHP. В общем случае, когда в PHP выполняются булевы сравнения и типы не совпадают (в данном случае это int), полезно использовать строгие сравнения.

Спасибо, ясно, что с оператором === результат будет FALSE, но 0 - это int, я могу тип события привести его к$res = (int)$val == (string)'true'; и результат все равно будет ИСТИНА. user1393876
Извините, я добавил еще один пример, чтобы прояснить свой вопрос. Я не имел в виду, что правый операнд должен быть 'true', это может быть любая строка, и когда PHP выполняет сравнение строки с целым числом 0 (ноль), результат равен: true. user1393876
@ user1393876 Это верно. Делатьintval('true') и посмотри, что получишь ... Michael Berkowski
@ user1393876 Да, я обращаюсь к этому выше.Любо нечисловая строка при приведении к целому числу равно 0. Michael Berkowski
Спасибо, Майкл, это все объясняет. user1393876
0

$val - первый оператор PHP, преобразующий строкуtrue к целому числу, которое становится 0. В результате 0 == 0 и ваш результат верен;

Спасибо за ваш ответ, поэтому, исходя из вашей логики, интерпретатор преобразует тип второго операнда в тип первого операнда, верно? Но если я изменю операнды, результат все равно верен:<?php $val = 0; $res = 'xxxxxx' == $val; var_dump($res); ?> user1393876
0

Попробуй эт

<?php
    $val = 1;
    $res = (bool)$val == 'true';

    var_dump($res);
?>

Похожие вопросы