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


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

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

(1234 == '1234 test')
6 78

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

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

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

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