我遇到了一些非常奇怪的 php 行为(ubuntu 10.04 上的 5.3.2)。应该在本地范围内发生的未设置正在影响调用函数的范围。以下片段是我的代码的简化,它显示了我只能假设是一个错误:
<?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;
),那么错误的行为就会消失。
更新