1. ホーム 
  2. 備忘録 
  3. PHP

参照渡し

参照渡しについて

PHP では変数同士を = で渡した場合、または関数の引数として渡した場合、基本的に『値渡し』となる

『参照渡し』を行いたい場合は変数名に & をつけて渡す必要がある

また例外として、オブジェクトは元々が参照型となる(正確には少し異なる)ため、参照を切って複製を行いたい場合は clone を使う必要がある

以下はそれらのコードのサンプルである

//===============================================//
// 基本的な変数の代入周りについて確認
//===============================================//
$a = 1;
$b = $a;  // 値渡し
$c =& $a; // 参照渡し $c は $a が書き変わると一緒に値が変わる
$a = 10;

echo $b;  // 1;
echo $c;  // 10;

//===============================================//
// 関数の引数の参照回りについて確認
//===============================================//
/**
 * 値渡しと参照渡しのチェック
 *
 * @param string $param1 値渡しの文字列
 * @param string $param2 参照渡しの文字列
 * @return void
 */
function refTest( $param1, &$param2 )
{
  $param1 = 'あいうえお';
  $param2 = 'かきくけこ';
}

$param1 = 'aiueo';
$param2 = 'kakikukeko';
refTest($param1, $param2);

echo $param1; // aiueo が表示される
echo $param2; // かきくけこ が表示される

//===============================================//
// オブジェクトの参照周りについて確認
//===============================================//
class Sample {
  public $text = 'aiueo';
}

// sample2 は そのまま渡して sample3 は clone して渡す
// その後 sample1 の値を書き換える
$sample1 = new Sample();
$sample2 = $sample1;
$sample3 = clone $sample1;
$sample1->text = 'あいうえお';

// 2つの違いを確認する
echo $sample2->text;  // あいうえお が表示される
echo $sample3->text;  // aiueo が表示される

参照渡しについては無暗に使用すると不要なメモリ確保が発生してしまうので、必要なもののみを見極めて使用すること

詳細は下記【参考文献】の欄を確認すること