Ответ 1
Использование следующего кода бросает уведомление во всех версиях PHP:
$b = array();
var_dump($b['foo']);
Все остальные варианты обычно не дают уведомления: http://3v4l.org/18qM5
Я запускаю PHP 5.5 и не могу отказаться от этого уведомления undefined offset.
$ php -a
Interactive mode enabled
php > error_reporting(E_ALL);
php > $b = null;
php > var_dump($b['foo']);
NULL
php > $b = "string";
php > var_dump($b['foo']);
PHP Warning: Illegal string offset 'foo' in php shell code on line 1
string(1) "s"
php > $b = 345678;
php > var_dump($b['foo']);
NULL
Я делаю что-то неправильно или уведомление о смещении undefined отменено для большинства типов данных?
Использование следующего кода бросает уведомление во всех версиях PHP:
$b = array();
var_dump($b['foo']);
Все остальные варианты обычно не дают уведомления: http://3v4l.org/18qM5
Я не могу дать вам точного объяснения, почему вы можете получить доступ к значению "NULL", как массив, но с PHP 5.X можно получить X-й символ строки, используя квадратные скобки.
Взгляните на следующий пример:
$string = "testing this stringy thingy";
$character = $string[0];
echo $character; //returns 't'
$character = $string[21];
echo $character; //returns 'h'
Я думаю, что это имеет какое-то отношение к доступу к NULL с помощью квадратных скобок... Может быть, кто-то еще может помочь с лучшим ответом:)
Обновление
При установке переменной как "NULL", PHP хранит ее в памяти, но ничего не используется. После установки переменной с помощью квадратных скобок переменная превращается в массив, и теперь ее можно получить как один (как мы ожидаем, когда что-то является массивом).
$string = null;
$string['abc'] = 123;
print_R($string); //Array ( [abc] => 123 )
echo gettype($string); //outputs "array".
var_dump(isset($string['abc'])); //returns "true"
Итак, почему PHP не бросает "E_NOTICE'error: Поскольку переменная автоматически добавляется в массив.