为什么PHP不再抛出“未定义的偏移量”提示?

12

我正在运行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
比较PHP版本:http://3v4l.org/1UoqI - Daniel W.
2个回答

2

在所有 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'错误呢: 因为该变量会自动转换为数组。


谢谢您的回答。我认为您对读取和写入上下文的工作方式有些混淆了。 - tacone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接