Возможный дубликат:
Оператор 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
.
При наложении строки на целое число числовых символов до первого нечислового символа становится числом. Таким образом, '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