PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPの参照渡しとは?値渡しとの違いを実例付きで解説


はじめに

PHPでは、関数へ引数を渡す際に「値渡し」と「参照渡し」の2つの方法があります。デフォルトは値渡しで、実際の引数の値が仮引数にコピーされ、関数内ではローカル変数として扱われます。そのため、関数内で仮引数を変更しても、呼び出し元の変数の値は変わりません。

一方、参照渡しの場合、仮引数は呼び出し元の変数への参照となるため、関数内での変更がそのまま元の変数に反映されます。この仕組みにより、グローバルスコープのデータを間接的に操作できるほか、「関数から返せる値は1つだけ」という制約も回避できます。

値渡し(Pass by Value)

次の例では、2つの変数をswap()関数に渡しています。関数内部では入れ替え処理が行われますが、呼び出し元の変数の値は変化しません。

コード例

<?php
function swap($arg1, $arg2){
    echo "関数内(入れ替え前): arg1=$arg1 arg2=$arg2\n";
    $temp=$arg1;
    $arg1=$arg2;
    $arg2=$temp;
    echo "関数内(入れ替え後): arg1=$arg1 arg2=$arg2\n";
}
$arg1=10;
$arg2=20;
echo "関数呼び出し前 : arg1=$arg1 arg2=$arg2\n";
swap($arg1, $arg2);
echo "関数呼び出し後 : arg1=$arg1 arg2=$arg2\n";
?>

実行結果

この例は次のような出力になります。

関数呼び出し前 : arg1=10 arg2=20
関数内(入れ替え前): arg1=10 arg2=20
関数内(入れ替え後): arg1=20 arg2=10
関数呼び出し後 : arg1=10 arg2=20

参照渡し(Pass by Reference)

引数を参照として受け取るには、仮引数の変数名の先頭に「&」記号を付けます。これにより、仮引数は関数呼び出し時に指定された変数への参照となります。そのため、関数内で行った入れ替えの結果が、渡された元の変数にも反映されます。

コード例

<?php
function swap(&$arg1, &$arg2){
    echo "関数内(入れ替え前): arg1=$arg1 arg2=$arg2\n";
    $temp=$arg1;
    $arg1=$arg2;
    $arg2=$temp;
    echo "関数内(入れ替え後): arg1=$arg1 arg2=$arg2\n";
}
$arg1=10;
$arg2=20;
echo "関数呼び出し前 : arg1=$arg1 arg2=$arg2\n";
swap($arg1, $arg2);
echo "関数呼び出し後 : arg1=$arg1 arg2=$arg2\n";
?>

実行結果

入れ替えの結果は次のように表示されます。

関数呼び出し前 : arg1=10 arg2=20
関数内(入れ替え前): arg1=10 arg2=20
関数内(入れ替え後): arg1=20 arg2=10
関数呼び出し後 : arg1=20 arg2=10

配列要素と参照

次の例では、配列の各要素が、配列の初期化より前に宣言された個々の変数への参照になっています。そのため、要素を変更すると、対応する変数の値も同時に変化します。

コード例

<?php
$a = 10;
$b = 20;
$c = 30;
$arr = array(&$a, &$b, &$c);
for ($i=0; $i<3; $i++)
$arr[$i]++;
echo "$a $b $c";
?>

実行結果

$a、$b、$c の値もそれぞれ1ずつ増加します。

11 21 31

配列を丸ごと参照渡しする

配列そのものを関数へ参照渡しすることも可能です。

コード例

<?php
function arrfunction(&$arr){
    for ($i=0;$i<5;$i++)
        $arr[$i]=$arr[$i]+10;
}
$arr=[1,2,3,4,5];
arrfunction($arr);
foreach ($arr as $i)
echo $i . " ";
?>

実行結果

変更後の配列は次のように表示されます。

11 12 13 14 15

オブジェクトと参照

PHPでは、オブジェクトはデフォルトで参照渡しとして扱われます。オブジェクトの参照を作成すると、$this の形式でも最初のオブジェクトへの参照が引数として渡されます。

コード例

<?php
class test1{
    private $name;
    function getname(){
        return $this->name;
    }
    function setname($name){
        $this->name=$name;
    }
}
$obj1=new test1();
$obj2=&$obj1;
$obj1->setname("Amar");
echo "名前: " .$obj2->getname();
?>

実行結果

上記のコードは次の出力を表示します。

名前: Amar

まとめ

  • デフォルトは値渡し:関数内での変更は呼び出し元の変数に影響しません。
  • 仮引数に「&」を付けると参照渡しになり、関数内の変更が元の変数に反映されます。
  • 配列の個々の要素や配列全体も参照渡しできます。
  • オブジェクトはデフォルトで参照として扱われるため、複製ではなく同一インスタンスを共有します。
  1. PHPのlog10()関数とは?常用対数の計算方法と具体例をわかりやすく解説

    定義と使用方法log10() 関数は、数値の常用対数(底が10の対数)を計算するための関数です。常用対数は「10を底とする対数」とも呼ばれ、log10x を求める際に使用されます。自然対数との間には、次のような関係式が成り立ちます。log10x = logex / loge10この式に基づけば、たとえば次のように計算できます。log10100 = loge100 / loge10 = 2PHPでは、この常用対数の計算を log10() 関数が担っています。構文log10 ( float $arg ) : floatパラメータ番号パラメータと説明1arg常用対数(底10の対数)を計算したい数値を

  2. PHPのlog()関数とは?自然対数の計算方法と使い方を解説

    定義と使い方log() 関数は、数値の自然対数(natural logarithm)を計算します。対数とは、指数関数の逆演算のことです。たとえば 102=100 という関係は「log10100=2」と表せます。自然対数はオイラー数 e を底として計算され、PHP では定義済み定数 M_E によって e の値(2.7182818284590452354)が提供されています。具体例を挙げると、exp(4.60517018599)=100(つまり e4.60517018599=100)が成り立つため、loge100=4.60517018599 となります。PHP では、この自然対数(loge)を l