PHPの代入には「値渡し」と「参照渡し」という方法があります。その違いや使い方を見ていきたいと思います。
値渡しとは
値渡しとはどういった代入方法なのでしょうか。
変数に変数を代入すると、代入した変数の値のコピーが代入されます。言葉で説明するとわかりにくいですが、どういうことなのか具体的に見ていきましょう。
プログラム:
$a = 1;
$b = $a;
$a = 2;
echo $b;
実行結果:
1
プログラム解説
「$b = $a」(2行目)で変数「$b」に変数「$a」を代入しております。この時点では「$a」の値は「1」であるため、当然「$b」の値も「1」になります。
次に3行目で「$a」の値を「2」に書き換えた後、さn「$b」の値を出力してみると、結果は「1」になりました。
「$a」を書き換えたのに「$b」の値が変わらなかったのは、「$b = $a」の部分で「$a」の値のコピーが代入されたためです。このことを値渡しといいます。
参照渡しとは
参照渡しとは値渡しと違って、変数のアドレスを渡す方法で、リファレンス渡しと呼ばれることもあります。このような説明ではよくわからないと思います。
プログラム:
$a = 1;
$b = &$a;
$a = 2;
echo $b;
実行結果:
2
プログラム解説
このプログラムは上の値渡しのプログラムとほぼ変わりませんが、1箇所だけ「$b = &$a」(2行目)の部分が異なります。変数の代入のときにアンパサンド「&」をつけることによって、「$b」に「$a」のメモリ上のアドレスを渡しております。
次に3行目で「$a」の値を「2」に書き換えた後、4行目で「$b」の値を出力してみると、結果は値渡しのときと違って、「2」になりました。
このように、「&」を使ってアドレスを渡すことを参照渡しといいます。またはリファレンス渡しといいます。
関数における引数の値渡し
何気なく使用している関数ですが、引数はどのように渡されているのでしょうか。
プログラム:
function f($a) {
$a = 2;
}
$a = 1;
f($a);
echo $a;
実行結果:
1
プログラム解説
関数(function f)を呼び出して、その中で引数の値を「1」から「2」へと書き換えていますが、echo で出力した変数「$a」の出力結果は変わっておりません。
これは引数を渡す際に、値をコピーして渡しているからです。
関数の参照渡し
関数の引数も参照渡しすることが可能です。
function f(&$a) {
$a = 2;
}
$a = 1;
f($a);
echo $a;
実行結果:
2
プログラム解説
上記の関数の値渡しとほとんど同じプログラムですが、関数 f の引数の頭に「&」をつけております。こうすると、関数内で変更した内容が戻っても反映されて、上のプログラムと違う結果になりました。
関数に引数を渡す際に、変数「$a」のメモリ上のアドレスが渡されているためです。
まとめ
PHPに変数を代入する方法として、値渡しと参照渡しという方法がありますが、その違いはご理解いただけたでしょうか。
通常使用するのは値渡しのほうであり、自分はプログラミングの際は参照渡しは一切使用しないという方も多いと思います。ただ、他人の作ったプログラムを見たとき、もしかしたら参照渡しが使われているかもしれないので、知っておいて損はないでしょう。
コメント
Thank you very much for the useful information
Thanks for the info, it made me happy.