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

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

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

(1234 == '1234 test')

Ответ 1

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

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

Ответ 2

В 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

Ответ 3

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

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

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

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

Ответ 4

Вы свободно сравниваете два разных типа данных (целое число и строку). 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

Ответ 5

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

Ответ 6

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

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