2014-08-27 2 views
1

Я следующее выражение PHPвыражение PHP верно

($g == $key) 

Значения: $g = objid и $key = 0

Если я дамп Выражение

var_dump(array($g == $key,$g, $key)); 

результат

array(3) { [0]=> bool(true) [1]=> string(5) "objid" [2]=> int(0) } 

Почему он показывает true? Я решаю проблему, используя === в своем выражении, но мне хотелось бы знать, почему это происходит.

+0

Там обязательно будет несколько обманутые этого вопроса, но, как всегда местонахождение их трудно. Google «Жесткое манипулирование PHP». – Jon

+2

Короче говоря, это ловушка PHP как языка. Лучше всего использовать оператор '===', потому что оператор '==' сильно несовместим. – eluong

+1

@eluong Я считаю, что это проблема с любым свободно типизированным языком, а не только с PHP (Javascript для одного). Лучший способ справиться с этим - всегда использовать '==='. :) –

ответ

2

Из manual:

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

«ObjId» не является допустимым числом, так он преобразуется в 0.

3

PHP преобразовывает ваш «ObjId» к междунар, и, вероятно, делает его 0, так что да, ваш «integerized строка» действительно равна 0:.

php > var_dump(' ' == 0, 'foobar' == 0, 'objid' == 0); 
bool(true) 
bool(true) 
bool(true) 

Обратите внимание, что если ваш " строка ObjId»НАЧАТЬ с номером, то это будет своего рода/Сорта/не-реально работать:

php > var_dump('a1b' == 0, '1ab' == 0); 
bool(true) 
bool(false) 

И используя строгий оператор сравнения === бы также решить эту проблему. Он сравнивает значения И типов. а 'foo' == 0 - это правда, 'foo' === 0 - это ложь.

1

=== является оператором равенства по типу - он гарантирует, что объекты, которые вы сравниваете, имеют один и тот же тип.

== проверяет, имеют ли оба объекта одинаковое значение «правдивость» или «ложь». Ex:

0 == '0' 

верно, потому что '0' считается falsey значение, но

0 === '0' 

является ложным, потому что один приведен ИНТ, а другой это строка

Смежные вопросы