Учение от Array ошибка? - PullRequest
       2

Учение от Array ошибка?

2 голосов
/ 16 июня 2011

У меня проблема с доктриной с этим кодом, которую я не могу объяснить.

public function fromArray(array $array, $deep = true) {
    $refresh = false;
    foreach ($array as $key => $value) {

        if ($key == '_identifier') {
            $refresh = true;
            $this->assignIdentifier($value);
            continue;
        }

Мой ключ (целое число) 0 будет равен (строка) «_identifier».Это ошибка в PHP или это нормально?или я что-то не так делаю?

Когда я изменяю код на $key === '_identifier', это работает.У меня PHP версии 5.3.4

Ответы [ 2 ]

5 голосов
/ 16 июня 2011

Это PHP:

echo (int) '_identifier'; // 0

И 0 равно 0. В операции сравнения строка преобразуется в целое число для сравнения.

Используйте ===, чтобы сделать сравнение того же типа. Называется идентично, не равно:

public function fromArray(array $array, $deep = true) {
    $refresh = false;
    foreach ($array as $key => $value) {
      if ($key === '_identifier') {
        $refresh = true;
        $this->assignIdentifier($value);
        continue;
      }
2 голосов
/ 16 июня 2011

Насколько я понимаю:

== - это просто общее сравнение, поэтому, если ваш ключ является целым числом, он преобразует строку в целое число для сравнения и из руководства :

Значение дается начальным часть строки. Если строка начинается с действительных числовых данных, это будет используемое значение. В противном случае значение будет 0 (ноль). Действительный числовой данные - необязательный знак, сопровождаемый одна или несколько цифр (опционально с десятичной точкой), а затем по дополнительному показателю. Экспонента это «е» или «е», за которым следует один или больше цифр.

=== является строгой оценкой, поэтому она также сравнивает типы.

Поэтому, когда вы делаете «0 == '_identifier'», оно проходит, поскольку оно оценивает '_identifier' как 0. Когда вы делаете «0 === '_identifier'», оно не проходит, так как они разных типов.

...