我在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()
调用。因此产生了上面的结果。
不管这样做的原因是什么,都不重要。在这种情况下,您应该始终检查变量是否存在和/或为空。最安全的方式(行为略有不同)是isset
和empty
:
isset($a['foo']);
!empty($a['foo']);