Intereting Posts
500 Внутренняя ошибка сервера с использованием PHP и SQLite Каков наилучший способ уменьшить количество запросов, когда у класса DAO есть методы, которые используют один и тот же результат? Как работает система плагинов (wordpress, mybb …)? json_decode (json_encode (индексированный массив)) дает NULL Как перенаправить все после слэш в домен раньше? Как я могу использовать PHP для динамического опубликования файла iical для чтения в Календаре Google? Пользователь должен просмотреть страницу перед просмотром Доктрина, не позволяющая ResultSetMappingBuilder работать PHP: расстояние между двумя адресами с Картами Google? Работает ли процесс загрузки сеанса с nginx и php-fpm? Как установить мыло атрибута mustUnderstand в php? php-страница не отображает арабский текст Извлечь содержимое папки с помощью ZipArchive PHP Flatten Array с несколькими листовыми узлами $ _COOKIE , похоже, не отражает изменений после установки

Почему 1234 == '1234 test' оценивается как true?

Возможный дубликат:
Оператор php == vs ===

Легкий ответ для кого-то, я уверен. Может ли кто-нибудь объяснить, почему это выражение оценивается как true?

(1234 == '1234 test') 

    Поскольку вы используете оператор == (сходство), а PHP принуждает строку к int.

    Для его устранения используйте оператор === (равенство), который проверяет не только, если значение одинаков, но и если тип данных тот же, поэтому строка «123» и 123 int не будут считаться равными.

    В PHP (и JavaScript – который имеет несколько другое поведение), оператор сравнения == работает иначе, чем в сильно типизированных языках, таких как C или Java. Оператор === имеет поведение, которое вы, скорее всего, ожидаете. Ниже приведена разбивка двух операторов сравнения применительно к PHP.

    ==

    Этот оператор официально известен как оператор равенства, хотя это не соответствует нормальному определению слова «равенство». Он делает то, что известно как сравнение типа жонглирования . Если типы обоих операндов не совпадают (в вашем примере 1234 было целым числом, а 1234 test был строкой), PHP будет неявно передавать операнды для типов друг друга и проверять равенство вновь введенных значений, как показано ниже:

     <?php var_dump( (int) 'hi' ); // int(0) var_dump( (string) 0 ); //string("0") var_dump( 'hi' == 0 ); // bool(true) var_dump( (int) '1hi' ); // int(1) var_dump( 1 == '1hi' ); // bool(true) 

    Он имеет оператор неравенства (type-juggling) != .

    ===

    Оператор === , известный как «идентичный» оператор, выполняет строгую проверку значения и типа обоих операндов и не выполняет никаких неявных отбросов. Поэтому "0" не === 0 а "1234 test" не === 1234 .

     <?php var_dump( '1234 test' === 1234 ); // bool(false) 

    Он имеет аналогичный (строгий) оператор неравенства !== .

    Причуды

    Обратите внимание, что оператор === имеет поведение на объектах, которые некоторые считают странными. Скажем, у нас есть class A и переменные $a и $b как определено ниже:

     <?php class A { public $property = 'default value'; } $a = new A(); $b = new A(); 

    Вы можете ожидать var_dump($a === $b); для вывода bool(true) . Он фактически вернет false. При использовании в объектах оператор фактически проверяет, являются ли оба операнда ссылками на один и тот же объект . Оператор == в этом случае работает, проверяя свойства объектов, поэтому $a == $b .

    Ссылки на PHP

    • Операторы сравнения
    • Тип жонглирования

    При наложении строки на целое число числовых символов до первого нечислового символа становится числом. Таким образом, '1234 test' становится 1234 потому что пространство не является числовым символом.

    Таким образом, 1234 == '1234 test'

    Если вы хотите принудительно провести сравнение строк, вы должны указать строку:

     ''.(1234) == '1234 test' // implicit (string) 1234 == '1234 test' // explicit strval(1234) == '1234 test' // procedural 

    Вы свободно сравниваете два разных типа данных (целое число и строку). PHP имеет очень подробный график того, как сравнения работают в их системе при использовании двоичного оператора (==):

    http://php.net/manual/en/types.comparisons.php

    Если вы хотите убедиться, что типы также синхронизированы, то есть они являются целыми или обеими строками, используйте оператор сравнения сильного типа (===).

    Обратите внимание: при использовании этого оператора это также вернет false:

     1234 === '1234' 

    Если вы не уверены в своих типах при сравнении, вы можете сравнить сильное сравнение с типизацией PHP:

     $a = 1234; $b = '1234'; if ($a === $b) { } // Will not fire, as it is false if ((int)$a === (int)$b) { } // Will fire, as it is true 

    Двойной эквивалент скажет php разобрать int из строки. Строка будет вычисляться до целого числа 1234. Для получения точного сравнения используйте triple equals '==='.

    Если вы сравниваете число со строкой или сравниваете числовые строки, то каждая строка преобразуется в число, а сравнение выполняется численно

     var_dump(0 == "a"); // 0 == 0 -> true