Почему 1234 = = '1234 test' оценивается как true? [дубликат]
Возможные Дубликаты:
php = = vs = = = оператор
простой ответ для кого-то, я уверен. Может кто-нибудь объяснить, почему это выражение верно?
(1234 == '1234 test')
6 ответов:
потому что вы используете оператор == (подобие) и 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)
он имеет аналог (тип-жонглирование) оператор неравенства,
!=
.===
The
===
оператор, известный как" идентичный " оператор, выполняет строгую проверку значения и тип обоих операндов и не выполняет никаких неявных преобразований. Таким образом,"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'
если вы хотите заставить сравнение строк, вы должны привести к string:
''.(1234) == '1234 test' // implicit (string) 1234 == '1234 test' // explicit strval(1234) == '1234 test' // procedural
вы свободно сравнивать два разных типа данных (целое число и строку). PHP имеет очень подробную диаграмму того, как сравнения работают в своей системе при использовании бинарного оператора loose comparison (==):
http://php.net/manual/en/types.comparisons.php
Если вы хотите убедиться, что типы также синхронизированы, то есть что они являются целыми числами или обеими строками, используйте сильный оператор сравнения типов (===).
обратите внимание, что, при использовании этого оператора он также возвращает false:
1234 === '1234'
Если вы не уверены в своих типах при сравнении, вы можете связать сравнение сильного типа с PHP typecasting:
$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