2016-12-15 6 views
1

で渡された配列は、この機能を参照することにより$feedback引数を取り、それを修正することがあります:クローン参照

private function removeEmptyAnswers(&$feedback) 
{ 
    //Do stuff with $feedback 
} 

私はそれが変更される前に、それをログに記録する、$feedbackのコピーを作成したいと思います:

private function removeEmptyAnswers(&$feedback) 
{ 
    $feedbackCopy = $feedback; 
    //Do stuff with $feedback 
    MyLog::write(['before' => $feedbackCopy, 'after' => $feedback]); 
} 

$feedbackが値渡された場合はピーナッツですが、参照渡しされます。つまり、$feedbackCopyも変更されますか?

グーグルで30分後に解決策が見つからないほど奇妙です。

参考のために渡された配列のコピーを作成するにはどうすればよいですか?

+1

'$ feedback'を変更すると、' $ feedbackCopy'は変更されません。 https://3v4l.org/072Pi実際には何も変更する必要はありません。 – Yoshi

答えて

3

アレイを別の変数に割り当てるだけで十分です。

$original = [1, 2, 3]; 
function meh (&$arr) { $copy = $arr; $copy[0] = 'meh'; } 
meh($original); 
var_dump($original); // unchanged 

function meh1(&$arr) { $arr[0] = 'meh'; } 
meh1($original); 
var_dump($original); // changed 

元の配列は、表示されているように変更されません。しかし、引数を変更すると、期待通りに変更されます。

また、AnthonyBで提案されているように、詳細はthis questionを参照してください。

+0

もう一度、PHPは期待されていない結果*を生成します。ありがとうございました。 –

+1

参照操作をしないで参照をコピーすると、実際には[ここ]で見られるように(参照:http://stackoverflow.com/questions/2840112/php-making-a-copy-of-a-reference-variable)、参照コピーは参照。 – AnthonyB