2

我在 facebook 的 phpsh 和标准的蹩脚 php 中都尝试了以下代码 - 一个 repl 的可恶:

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

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

像 Ruby 和 Python 这样的更智能的语言在尝试从 None 或 nil 中取消引用键时都会抱怨。PHP 如何解释这种情况?唯一的治疗方法是到处插入 is_null 检查吗?我应该责怪Smarty没有为我做这件事吗?

4

1 回答 1

2

根据 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;or return 0;,这意味着 NULL,而不是返回的zval*(指针)或zend_error()调用。因此得到上述结果。

不管是什么原因造成的,这并不重要。在这种情况下,您应该始终检查变量是否存在和/或无效。最安全的方法(略有不同的行为)是issetempty

isset($a['foo']);
!empty($a['foo']);    
于 2011-04-14T15:59:59.580 回答