我遇到了一些非常奇怪的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