PHP入門

【PHP入門】値渡しと参照渡し

2021年6月22日

はじめに

前回の記事では、PHPの関数(function)について紹介しました。

本記事では、引数の渡し方(「値渡し」と「参照渡し」)について紹介します。

関数の引数に値を渡す方法には「値渡し」と「参照渡し」があります。

値渡しとは

参照渡しとは、変数の値をコピーして渡す方法です。変数の値をコピーして渡すため、関数内で引数の値を変更しても、呼び出し元の変数に影響を及ぼすことはありません。

値渡しの書き方は次のとおりです。

値渡しの書き方

以下は値渡しのイメージ図です。

値渡しのイメージ例

変数の値の実体はメモリ上で管理されています。値渡しは変数の値をコピーして渡すので、メモリ上の実体もコピーされます。

そのため、呼び出し元の変数と呼び出された関数の引数は異なる実体を参照しています。

スポンサーリンク

値渡しの使用例

それでは、実際にPHPのプログラムで値渡しの例を紹介します。

[値渡しの例]

<?php

function test($a) {
    $a = "変更しました";
    print("関数内の値:$a<br />");
}

// 関数の実行
$b = "あいうえお";
test($b);
print("関数外の値:$b");

?>

[実行結果]

関数内の値:変更しました
関数外の値:あいうえお

値渡しは変数の値をコピーして渡す方法であり、呼び出し元の変数と呼び出された関数の引数は異なる実体を参照しています。

参照している実体が違うので、呼び出された関数の引数である「$a」の変更は、呼び出し元の変数「$b」には反映されていません。(「$b」の値は「あいうえお」のまま変わっていない)

参照渡しとは

参照渡しとは、変数のメモリ番地(メモリ上の位置)を渡す方法です。変数のメモリ番地を渡しているため、関数内で引数の値を変更すると、呼び出し元の変数も変更されてしまいます。

参照渡しの書き方は次のとおりです。引数に「&」をつけます。

参照渡しの書き方

以下は参照渡しのイメージ図です。

参照渡しのイメージ例

変数の値の実体はメモリ上で管理されています。参照渡しは変数のメモリ番地を渡すので、メモリ上では実体のメモリ番地がコピーされます。

  • 呼び出し元の変数:実体を参照
  • 関数の引数:実体のメモリ番地を参照 → メモリ番地をたどって実体を参照

そのため、呼び出し元の変数と呼び出された関数の引数は同じ実体を参照しています。

参照渡しの使用例

それでは、実際にPHPのプログラムで参照渡しの例を紹介します。

[参照渡しの例]

<?php

function test(&$a) {
    $a = "変更しました";
    print("関数内の値:$a<br />");
}

// 関数の実行
$b = "あいうえお";
test($b);
print("関数外の値:$b");

?>

[実行結果]

関数内の値:変更しました
関数外の値:変更しました

参照渡しは変数のメモリ番地を渡す方法であり、呼び出し元の変数と呼び出された関数の引数は同じ実体を参照しています。

参照している実体が同じなので、呼び出された関数の引数である「$a」の変更は、呼び出し元の変数「$b」にも反映されています。(「$b」の値は「変更しました」に変わっている)

終わりに

本記事では、PHPの「値渡し」と「参照渡し」について紹介しました。

次回の記事では、PHPの可変長引数について紹介します。

helpful