Подтвердить что ты не робот

Почему PHP больше не бросает уведомление "undefined offset"?

Я запускаю 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 отменено для большинства типов данных?

4b9b3361

Ответ 1

Использование следующего кода бросает уведомление во всех версиях PHP:

$b = array();
var_dump($b['foo']); 

Все остальные варианты обычно не дают уведомления: http://3v4l.org/18qM5

Ответ 2

Я не могу дать вам точного объяснения, почему вы можете получить доступ к значению "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: Поскольку переменная автоматически добавляется в массив.