質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

PHPで「&$value」と書いた時の「&」の意味がわかりません

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 483

tokyodesk

score 56

$a = array(1, 2, 3, 4);
foreach ($a as &$value) {
    $value = $value * 2;
}


上記のように書くと、$a はarray(2, 4, 6, 8)になりますが、&を取り除いて

$a = array(1, 2, 3, 4);
foreach ($a as $value) {
    $value = $value * 2;
}


このように書くと、$aの中身は書き換わりません。

これはどうしてなのでしょうか。
レファレンスの意味がよくわかりません。

(追記①)
アドバイスありがとうございます。
「$a=&$c」のような使い方では、$cが$aのエイリアスのように振る舞うと考えれば理解できたのですが、foreachで「$a as &$value」のように書かれた時に何がどうなっているのかわかりませんでした。

$a = array(1, 2, 3, 4);
foreach ($a as $value) {
    $value = $value * 2;
    echo $value.'<br>';
    var_dump($a);
}


上記のように「&」をつけない場合は$valueは2倍されていますが、$aは2倍されていません。
逆に「foreach ($a as &$value)」のように、「&」をつけると、$aも2倍されます。
「$a as &$value」と書くと$aは$valueを参照するようになると考えればいいのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/12/03 16:38

    PHPマニュアルは確認されました? http://php.net/manual/ja/language.references.pass.php 「参照渡し」としても分かりませんでしょうか

    キャンセル

  • tokyodesk

    2018/12/04 12:15

    アドバイスありがとうございます。 マニュアルを見ましたが、関数に&をつけた関数を代入していて最初の例以外はあまり理解できませんでした。 こちらのページの参照渡しは理解できたと思います。 http://php-beginner.com/reference/variable/reference_var.html

    キャンセル

  • m.ts10806

    2018/12/04 12:52

    途中echoやvar_dump()でデータの動きを追ってみたほうがいいですね。そうすると理解が深まります。

    キャンセル

  • tokyodesk

    2018/12/06 16:34

    了解です。ありがとうございます。

    キャンセル

回答 4

+4

マニュアル確認して下さい

$a=1;
$a=&$b;
$b=2;
print $a;//2


$aを$bとして宣言しておくと、$bを編集したら$aに値が反映される仕組みです
ちなみにjavascriptのオブジェクトも同じ仕組みです

<script>
var a=b={};
b.x=2;
console.log(a.x);
</script>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/06 16:45

    javascriptでも同じようなものがあるんですね。
    了解です。
    ありがとうございます。

    キャンセル

+3

一応簡単なサンプルコードを置いておきます。

function test(&$b){
    $b = "b";
}
$a = "a";
echo $a;
test($a);
echo $a;


出力結果:ab

参照渡しをするとその変数の実体が渡るので別の変数名で受け取ったとしても受け取った先で書き換えた場合はその後は書き変わった値が有効になります。
foreachはその変数のコピーが渡されて処理が行われるので、その渡し方を参照渡しにしただけですね。

まあ・・既に回答がついているように特にforeachで参照渡し使わなきゃいけない場面って見当たらないですけど。
下記のような検証記事もあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

checkベストアンサー

+1

&を付けない場合は、$aのコピーとして$valueを作成するので、$valueを書き換えても$aに影響はない。

&を付けた場合は、$aを参照する変数として$valueを作成するので、$valueへの書き込みは、$aの書き込みと同じことになります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/04 12:19

    ありがとうございます。
    大変わかりやすかったです。
    &をつけると、$aも$valueの書き換わりを認識しているので「$aを参照する変数が$valueである」ということは、「$aも$valueを参照する」ということになるのでしょうか。

    キャンセル

  • 2018/12/05 09:14

    動作的にはそうなりますが、あくまでも$aは本体であり、$aを参照しているのが$valueという位置づけです。
    なので、$valueを unset しても $aは影響を受けません。

    キャンセル

  • 2018/12/06 16:43

    $aをunsetして確認してみると$aはNULLで、$valueは最後の8が表示されることを確認できました。
    参照渡しをforeacheで使うとこのような挙動になるというように理解しておきたいと思います。
    ありがとうございました。

    キャンセル

+1

使わないので覚えなくていいし忘れていい。
余計な知識は不要。

PHPで参照渡しを使っていいのは無名関数のuseのみ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/12/04 12:22

    え、そうなんですか??
    参照渡しの概念を理解すること自体は、PHPで開発をしようと思っている時は必須でしょうか?

    キャンセル

  • 2018/12/04 13:24

    読むときにはいるけど、書くときにはいらんねぇ。
    忘れちゃダメだけど、余計な知識は必要ない感じ。

    キャンセル

  • 2018/12/06 16:44

    そうなんですね。
    読めないのも困ると思うので、基本的な動きは理解しておきたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る