Почему код не выдает NOTICE?

Рейтинг: 0Ответов: 1Опубликовано: 08.09.2014

Здравствуйте.

Подскажите, пожалуйста, почему сей код не выдает NOTICE?

error_reporting(E_ALL);

$v = NULL;

echo $v[0];

Соответственно, если $v не объявлять как NULL, то будет Notice: Undefined variable: v in

Спасибо.

Ответы

▲ 1

Ответ оказался довольно простым. Когда PHP что-то не нравится, он конвертирует тип. При чем разобраться, когда это преобразование на лету является валидным, а когда невалидным, представляется невозможным. Короче:

Converting NULL to an array results in an empty array.

http://php.net/manual/en/language.types.array.php

и еще забавная строчка оттуда же:

Null will be cast to the empty string, i.e. the key null will actually be stored under "".

При попытке выставить индекс PHP смотрит на переменную, находит NULL, считает его эквивалентным array, преобразует в пустой массив и проставляет значение. Уведомление не появляется, потому что по философии разработчиков NULL идентичен array. А ведь могли бы и запилить.

Доказательство:

$a = null;
$a[0] = 'What the hell?';
var_dump(null == array(), $a == null, gettype($a), $a);
/*
    bool(true)
    bool(false)
    string(5) "array"
    array(1) {
      [0] =>
      string(14) "What the hell?"
    }
*/

p.s. хотя все равно непонятно, почему доступ к несуществующему индексу не сопровождается уведомлением.

p.p.s. уиииииииииииииииииииии

$varA = null;
for ($i = 0; $i < 999; $i++) {
    $varA = $varA[$i];
    // $varB = null[$i]; // вот заметьте, здесь он ругнется на невалидный синтаксис
}
var_dump($varA /*, $varB*/);