【发布时间】:2012-12-28 04:17:19
【问题描述】:
我遇到了一些非常奇怪的 php 行为(ubuntu 10.04 上的 5.3.2)。应该在本地范围内发生的未设置正在影响调用函数的范围。以下 sn-p 是我的代码的简化,它显示了我只能假设是一个错误:
<?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;),那么错误的行为就会消失。
更新
【问题讨论】:
-
我看到分配给它的开发人员关闭了它。不过,他似乎没有正确解释这个问题。很好奇您是否已经撰写或考虑撰写某种后续行动?
-
是的,我也看到了。我在历史上看到了你的评论。似乎开发人员不明白我想要展示的内容。也许他实际上并没有运行我的代码,因为他说注释掉该行没有任何区别,而且显然确实如此。
标签: php