为什么没有错误在PHP中,如果你试图使用括号来获得一个NULL键的值


Why is there no error in PHP if you try to use brackets to get the value of a key on a NULL?

我在facebook的php和标准的蹩脚php中尝试了以下代码:

$a = NULL;
echo $a['foobar'];

令我遗憾的是(当涉及到PHP时,我不会说它令人惊讶或失望),我没有得到任何错误、警告或异常或任何东西。

像Ruby和Python这样聪明的语言在试图从None或nil解引用键时都会报错。PHP如何解释这种情况?唯一的解决方法是到处插入is_null检查吗?我应该怪Smarty没有帮我吗?

根据PHP源代码(Zend/zend_execute.c),只有字符串、数组和对象可以在访问偏移量/索引时触发错误。其余部分或多或少被忽略:

$a = true;
$b = false;
$c = null;
$d = 1;
$e = 1.234;
$f = '';
$g = array();
$h = new stdClass;
echo $a[0]; // NULL
echo $b[0]; // NULL
echo $c[0]; // NULL
echo $d[0]; // NULL
echo $e[0]; // NULL
echo $f[0]; // E_NOTICE: Uninitialized string offset
echo $g[0]; // E_NOTICE: Undefined offset
echo $h[0]; // E_FATAL:  Cannot use object as array

$a, $b, $c, $d$e实际上都没有错误。大多数时候在代码中,我只看到return;return 0;,这意味着NULL,而不是返回zval*(指针)或zend_error()调用。因此产生了上面的结果。

不管这样做的原因是什么,都不重要。在这种情况下,您应该始终检查变量是否存在和/或为空。最安全的方式(行为略有不同)是issetempty:

isset($a['foo']);
!empty($a['foo']);