php

値渡しと参照渡し

値渡し
右辺値を渡す方法で、実引数として変数を渡したとしても、その値のみが渡される。もちろん即値や複雑な式を渡すこともでき、式の評価結果が渡される。その仕組みとしては、独立した新たな変数が関数内に用意され、元の値がコピーされる。そのため変数を渡したとしても、元の変数が変更されるという事はない。
これは「関数が副作用を持たない」という観点から、計算を中心とする言語では望ましい動作といえる。またそもそも代入概念のない関数型言語では、引数は必ず値で渡されると考えられる(ただし、代入が存在しない以上コピーをとる必要もない)。

参照渡し
その実装手段の一つで、変数に対する参照(アドレス情報)を渡す方法である。(これは言語側が勝手に行う。C言語のように明示的にアドレス演算子を使うものは参照渡しとは呼ばない。) その他、値渡しと同じようにコピーを渡しておいて、関数/サブルーチンからのリターン時に元の変数に変更結果をコピーしなおす方法もある。PL/Iでは、どちらの方法で実装しても良いと規定されている。

 

<?php
print “<b>値渡し</b><br><br>”;
function smple01($a){
print “チェック2→”.$a.”<br>”;/*実行直後なので100のまま*/
$a = $a * 2;/*2倍する*/
print “チェック3→”.$a.”<br>”;/*関数で2倍されたので200*/
return $a;
}

$a = 100;
print “チェック1→”.$a.”<br>”;/*引数が100なので100*/
$b = smple01($a);/*ここで関数実行*/
print “チェック4→”.$a.”<br>”;/*関数の外なので無関係に100のまま*/

print “<br><br>”;

print “<b>参照渡し</b><br><br>”;
function smple02(&$a){/*&をつけて参照渡しを宣言*/
print “チェック2→”.$a.”<br>”;/*実行直後なので100のまま*/
$a = $a * 2;/*2倍する*/
print “チェック3→”.$a.”<br>”;/*関数で2倍されたので200*/
return $a;
}

$a = 100;
print “チェック1→”.$a.”<br>”;/*引数が100なので100*/
$c = smple02($a);/*参照渡し付き関数を実行、Cに代入*/
print “チェック4→”.$a.”<br>”;/*2倍された値が関数の外に持ち出されている*/
?>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です