我遇到了一些非常奇怪的PHP行为(5.3.2在Ubuntu 10.04上)。在本地范围内发生的未设置会影响呼叫者功能的范围。下面的代码片段是我的代码的简化,显示什么,我只能认为是一个错误:php未设置影响全局范围的本地参考
<?php
function should_not_alter($in)
{
$in_ref =& $in['level1'];
should_only_unset_locally($in);
return $in;
}
function should_only_unset_locally($in)
{
unset($in['level1']['level2_0']);
}
$data = array('level1' => array('level2_0' => 'first value', 'level2_1' => 'second value'));
$data = should_not_alter($data); //test 1
//should_only_unset_locally($data); //test 2
print_r($data);
?>
如果你运行上面,你会看到该值'first value'
在全球范围内一直未设置从$data
阵列。但是,如果您注释掉test 1
并运行test 2
这不会发生。
我只能假设PHP不喜欢引用数组的元素。在我的代码中,我需要更改$in_ref
- 因此在上面的代码中$in_ref =& $in['level1'];
行的原因。我意识到,删除这条线将解决在全球范围内未被设置的'first value'
的问题,但这不是一个选项。
任何人都可以确认,如果这是PHP的预期行为?
我怀疑它是一个错误,而不是一个功能,因为这种行为与php处理范围和引用与正常(非数组)变量的方式不一致。例如,使用字符串,而不是阵列功能should_only_unset_locally()
对全球范围没有影响:
<?php
function should_not_alter($in)
{
$in_ref =& $in;
should_only_unset_locally($in);
return $in;
}
function should_only_unset_locally($in)
{
unset($in);
}
$data = 'original';
$data = should_not_alter($data); //test 1
//should_only_unset_locally($data); //test 2
print_r($data);
?>
两者TEST1或TEST2输出original
如预期。实际上,即使$data
是一个数组,但$in_ref
被引用到整个数组(即$in_ref =& $in;
),那么车的行为就会消失。
更新
我看到它被分配给它的开发关闭它。尽管如此,他似乎没有正确解释问题。我很好奇,如果你已经写或考虑写一些跟进? – Corbin
是的,我也看到了。我在历史中看到你的评论。似乎开发人员不明白我想表现出什么。也许他实际上没有运行我的代码,因为他说注释掉这条线没有什么区别,显然它确实如此。 – mulllhausen