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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

829閲覧

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

tokyodesk

総合スコア56

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/12/03 07:25

編集2018/12/04 03:16
$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を参照するようになると考えればいいのでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokyodesk

2018/12/04 03:15

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

2018/12/04 03:52

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

2018/12/06 07:34

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

回答4

0

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

php

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

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

javascript

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

投稿2018/12/03 07:45

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokyodesk

2018/12/06 07:45

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

0

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

php

1function test(&$b){ 2 $b = "b"; 3} 4$a = "a"; 5echo $a; 6test($a); 7echo $a;

出力結果:ab

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

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

投稿2018/12/03 07:47

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2018/12/03 07:40

kawax

総合スコア10377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokyodesk

2018/12/04 03:22

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

退会済みユーザー

2018/12/04 04:24

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

2018/12/06 07:44

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

0

ベストアンサー

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

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

投稿2018/12/04 00:59

kasa0

総合スコア578

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tokyodesk

2018/12/04 03:19

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

2018/12/05 00:14

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

2018/12/06 07:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問