当您将变量作为数组取消引用(用于读取)时,虚拟机将在内部调用zend_fetch_dimension_address_read http://lxr.php.net/xref/PHP_TRUNK/Zend/zend_execute.c#1249,这又将正确的值加载到结果变量中,具体取决于您尝试取消引用的变量的类型。
如果是null
(以及 int / float / bool),它会选择这个分行 http://lxr.php.net/xref/PHP_TRUNK/Zend/zend_execute.c#1261:
case IS_NULL:
result->var.ptr = &EG(uninitialized_zval);
PZVAL_LOCK(&EG(uninitialized_zval));
return;
Whereby EG(uninitialized_zval)
基本上是null
本身;发生这种情况时不会发出任何通知。正如阿迈勒所指出的,有一个错误报告 https://bugs.php.net/bug.php?id=64194对于这种行为,但近一年来并没有采取太多措施。
文档说“将 NULL 转换为数组会导致空数组。”
数组取消引用不会将某些内容转换为数组(除非您使用[]
或在写入上下文中使用它)。手册中提到的转换很可能是数组转换:
var_dump((array)null);
// array(0) { }
Update
在深入研究系统之后,我发现这(部分)使得以下构造起作用:
$list = ['foo', 'bar', 'baz'];
while (list($key, $value) = each($list)) {
echo "$key: $value\n";
}
当到达数组末尾时,each()
回报false
所以在内部false[0]
and false[1]
在之前进行评估list()
表达式本身产生false
.