为什么PHP不再抛出“未定义的偏移”通知?

时间:2014-09-26 12:45:37

标签: php

我正在运行PHP 5.5并且无法让它再次抛出未定义的偏移通知。

$ 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

我做错了什么或者大多数数据类型都取消了未定义的偏移通知吗?

2 个答案:

答案 0 :(得分:2)

使用以下命令会在所有PHP版本中抛出通知:

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

所有其他变体通常不会发出通知:http://3v4l.org/18qM5

答案 1 :(得分:2)

我无法准确地解释为什么你可以像数组一样访问'NULL'值,但是从PHP 5.X开始,可以使用方括号来获取字符串的第X个字符。 / p>

看看下面的例子:

$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: 因为变量会自动转换为数组。