私は非常に奇妙なPHPの動作(ubuntu 10.04では5.3.2)に遭遇しました。ローカルスコープ内で発生するはずの設定が、呼び出し側関数のスコープに影響します。次のスニペットは、バグです私は想定できるものを表示する私のコードを簡略化したものである: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がスコープとリファレンスを通常の(配列ではない)変数で扱う方法と矛盾するためです。予想通り
<?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
両方:例えば、配列関数should_only_unset_locally()
ではなく、文字列を使用すると、グローバルスコープに影響を及ぼしません。実際には$data
が配列だが$in_ref
が配列全体(つまり$in_ref =& $in;
)を参照していても、バグの振る舞いは消えてしまいます。
更新
私はそれがそれを閉鎖するために割り当てられたdevを参照してください。彼は問題を正しく解釈していないようです。あなたがすでに何らかのフォローアップを書いている、あるいは書いていると思っているのであれば、興味がありますか? – Corbin
私もそれを見ました。私は歴史の中であなたのコメントを見ました。デベロッパーが私が何を表示しようとしているのか理解できなかったようです。おそらく彼は実際に私のコードを実行していない可能性がありますので、彼はラインをコメントアウトすることは何の違いもなく、明らかにそうです。 – mulllhausen