tag:crieit.net,2005:https://crieit.net/tags/%E5%8F%82%E7%85%A7%E3%81%AE%E5%80%A4%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%E3%81%AE%E5%80%A4%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