tag:crieit.net,2005:https://crieit.net/tags/%E5%8F%82%E7%85%A7%E6%B8%A1%E3%81%97/feed 「参照渡し」の記事 - Crieit Crieitでタグ「参照渡し」に投稿された最近の記事 2019-06-24T00:26:52+09:00 https://crieit.net/tags/%E5%8F%82%E7%85%A7%E6%B8%A1%E3%81%97/feed tag:crieit.net,2005:PublicArticle/15157 2019-06-24T00:26:52+09:00 2019-06-24T00:26:52+09:00 https://crieit.net/posts/862e62c7911e527564fa9231fb64a4f9 参照の値渡しがわからなかったのだけれども <p>ちょっと前に、参照渡しが盛り上がりましたね。<br /> 参照渡しというか、参照の値渡しがどうもしっくりこなくて。</p> <p>ちょっとPHPで書いてみます。</p> <h2 id="①オブジェクトを渡してプロパティを変える"><a href="#%E2%91%A0%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%B8%A1%E3%81%97%E3%81%A6%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%92%E5%A4%89%E3%81%88%E3%82%8B">①オブジェクトを渡してプロパティを変える</a></h2> <p>これを最初に見た時の感想は、<br /> 「プロパティが変わってる! そうか、これは参照渡しなんだ!」では<strong>断じてなくて</strong>、<br /> 「なんで値渡しなのに関数の外で変わってんだよ!」だったのですが。</p> <pre><code class="php">$a = new stdClass(); $a->hoge = 5; $a->fuga = 10; var_dump($a); func($a); var_dump($a); function func($a){ $a->hoge = 6; } </code></pre> <pre><code class="php">class stdClass#1 (2) { public $hoge => int(5) public $fuga => int(10) } class stdClass#1 (2) { public $hoge => int(6) public $fuga => int(10) } </code></pre> <h2 id="②オブジェクトを渡してオブジェクトごと変える"><a href="#%E2%91%A1%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%B8%A1%E3%81%97%E3%81%A6%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%94%E3%81%A8%E5%A4%89%E3%81%88%E3%82%8B">②オブジェクトを渡してオブジェクトごと変える</a></h2> <pre><code class="php">$a = new stdClass(); $a->hoge = 5; $a->fuga = 10; var_dump($a); func($a); var_dump($a); function func($a){ $a = new stdClass(); $a->hoge = 6; $a->fuga = 11; } </code></pre> <pre><code class="php">class stdClass#1 (2) { public $hoge => int(5) public $fuga => int(10) } class stdClass#1 (2) { public $hoge => int(5) public $fuga => int(10) } </code></pre> <p>むしろこれが普通だろ、値渡しなんだから。と思っていたけど、そうすると、なんで①は変わってしまうの??? って状態だった。</p> <h2 id="参照の値渡し"><a href="#%E5%8F%82%E7%85%A7%E3%81%AE%E5%80%A4%E6%B8%A1%E3%81%97">参照の値渡し</a></h2> <p>色々な記事をみて、「参照渡し」と、「参照の値渡し」というのがあるってのはわかって、なんとなく、ぼやーっとはわかったような、わからないような。</p> <p>②が普通だと思っていたのに、①を見てから②を見ると、なんか変というか、<br /> まるで、newした瞬間に何かが起こったような、突然変異でも起きたの? みたいなもやもやがあった。<br /> けど、下のコードを思い至って、少しスッキリした。<br /> とどのつまり、実際、結局、newした瞬間に何かが起こったわけだ。<br /> 参照値が変わった、ということなのかな?</p> <pre><code class="php">$a = new stdClass(); $a->hoge = 5; $a->fuga = 10; var_dump($a); func($a); var_dump($a); function func($a){ $a->hoge = 0; $a = new stdClass(); $a->hoge = 6; $a->fuga = 11; } </code></pre> <pre><code>class stdClass#1 (2) { public $hoge => int(5) public $fuga => int(10) } class stdClass#1 (2) { public $hoge => int(0) public $fuga => int(10) } </code></pre> <p>なんで、みんな①と②だけ説明して、このコードを書いてくれなかったんだろう。(見つけてないだけで書いてるのかな?)<br /> ……みんな①と②だけでわかるのか。俺の頭がわるいのか。</p> <p>逆にこれを見て、何がわかったのかわからない、という人の方が多いのかも。<br /> なんというか、これをうまく言語化できない。<br /> うまく言語化できそうになったら書き直す。(かもしれない)</p> hammhiko