строка 'w32' == 0 оценивается как истина в php. Хм?

Итак, я получил уведомление в своем php при создании канала продукта Google. Уведомление звучало так: «Следующее уведомление php появилось сегодня 4989 раз на сайте _: Уведомление PHP: Неопределенный индекс: 0 в /xxx/Status.php в строке 583».

Это был код в этом классе

public function inStockLocally($productcode)
{
    if($this->_status[$productcode]['status'] == self::IN_STOCK) {
        return $this->_status[$productcode]['in_stock_local'];
    }
    return false;
}

Функция получала $productcode = 0, но на самом деле код продукта был «w32», поэтому ключа не существовало.

вверх по стеку, где вызывалась функция, я поместил это, чтобы сломать проблемный продукт.

    if ($productcode == 0) {
        $test = 'breakhere';
    }

Используя netbeans и firebug, он сломался в строке, когда $productcode = 'w32'

Итак, мой вопрос: почему «w32» == 0 оценивается как true? Он также оценивается как true с другими подобными структурными кодами, такими как «h94».

Любая помощь будет оценена по достоинству, поскольку никто в отделе не может понять, почему это происходит.

Я предполагаю, что я не помещал достаточно информации в q. Происходят две вещи. 1. 'w32' почему-то преобразовано в число = 0. 2. [0] вставляется как мой ключ в массив, когда код продукта имеет структуру 'x##';


person Mr. Berzerk    schedule 27.09.2013    source источник
comment
Связано: stackoverflow.com/questions/15813490/   -  person CSᵠ    schedule 28.09.2013


Ответы (2)


Я здесь немного новичок, поэтому извините, если это не тот ответ, который вы ожидали, но PHP выполняет много автоматического преобразования типов. Таким образом, любая строка, которая не начинается с числового символа (0..9, +, - и т. д.), будет равна нулю.

person sosaisapunk    schedule 27.09.2013
comment
Хорошо, спасибо имеет смысл, но зачем вводить 0 в качестве ключа для $this-›_status[0]['status'] В этом случае сравнения не происходит. Обратите внимание, что мое уведомление php говорит, что индекс 0 не определен, когда он должен говорить, что индекс «w32» не определен. (На самом деле это определено, но это просто для аргументов.) - person Mr. Berzerk; 28.09.2013
comment
Правило не может всегда выполняться, потому что код продукта 'cat2011' никогда не = 0. - person Mr. Berzerk; 28.09.2013

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

http://php.net/manual/en/language.operators.comparison.php

Кроме того, я предполагаю, что у вас есть индексированный массив, хотя вы ожидаете, что он будет ассоциативным массивом:

Функция array() используется для создания массива.

В PHP существует три типа массивов:

Индексированные массивы — Массивы с числовым индексом Ассоциативные массивы — Массивы с именованными ключами Многомерные массивы — Массивы, содержащие один или несколько массивов Синтаксис Синтаксис для индексированных массивов:

массив(значение1,значение2,значение3 и т.д.);

Синтаксис для ассоциативных массивов:

массив (ключ => значение, ключ => значение, ключ => значение и т. д.);

person Jouni Aro    schedule 27.09.2013
comment
Хорошо, спасибо за совет. Я не знал об этом. Однако я обнаружил, что в этом случае они лаконично объясняют разницу между типами массивов, чего я больше нигде не нахожу. Страница руководства php.net/manual/en/language.types.array.php, например, не может определить это различие каким-либо полезным способом. - person Jouni Aro; 13.10.2013
comment
Проблема в том, что у них есть несколько страниц, которые могут быть хорошими. Но начинающий PHP, идущий туда, в конечном итоге окажется на http://www.w3schools.com/php/php_mysql_insert.asp - и напишет код с зияющими дырами для SQL-инъекций. - person ThiefMaster; 14.10.2013
comment
Хорошо, я удалил ссылку и скопировал соответствующий текст сюда. Тем не менее, я считаю, что это правильный ответ на исходную проблему. - person Jouni Aro; 14.10.2013