2019-06-24に投稿

参照の値渡しがわからなかったのだけれども

ちょっと前に、参照渡しが盛り上がりましたね。
参照渡しというか、参照の値渡しがどうもしっくりこなくて。

ちょっとPHPで書いてみます。

①オブジェクトを渡してプロパティを変える

これを最初に見た時の感想は、
「プロパティが変わってる! そうか、これは参照渡しなんだ!」では断じてなくて
「なんで値渡しなのに関数の外で変わってんだよ!」だったのですが。

$a = new stdClass();
$a->hoge = 5;
$a->fuga = 10;

var_dump($a);

func($a);

var_dump($a);

function func($a){
    $a->hoge = 6;
}
class stdClass#1 (2) {
  public $hoge =>
  int(5)
  public $fuga =>
  int(10)
}

class stdClass#1 (2) {
  public $hoge =>
  int(6)
  public $fuga =>
  int(10)
}

②オブジェクトを渡してオブジェクトごと変える

$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;
}
class stdClass#1 (2) {
  public $hoge =>
  int(5)
  public $fuga =>
  int(10)
}

class stdClass#1 (2) {
  public $hoge =>
  int(5)
  public $fuga =>
  int(10)
}

むしろこれが普通だろ、値渡しなんだから。と思っていたけど、そうすると、なんで①は変わってしまうの??? って状態だった。

参照の値渡し

色々な記事をみて、「参照渡し」と、「参照の値渡し」というのがあるってのはわかって、なんとなく、ぼやーっとはわかったような、わからないような。

②が普通だと思っていたのに、①を見てから②を見ると、なんか変というか、
まるで、newした瞬間に何かが起こったような、突然変異でも起きたの? みたいなもやもやがあった。
けど、下のコードを思い至って、少しスッキリした。
とどのつまり、実際、結局、newした瞬間に何かが起こったわけだ。
参照値が変わった、ということなのかな?

$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;
}
class stdClass#1 (2) {
  public $hoge =>
  int(5)
  public $fuga =>
  int(10)
}

class stdClass#1 (2) {
  public $hoge =>
  int(0)
  public $fuga =>
  int(10)
}

なんで、みんな①と②だけ説明して、このコードを書いてくれなかったんだろう。(見つけてないだけで書いてるのかな?)
……みんな①と②だけでわかるのか。俺の頭がわるいのか。

逆にこれを見て、何がわかったのかわからない、という人の方が多いのかも。
なんというか、これをうまく言語化できない。
うまく言語化できそうになったら書き直す。(かもしれない)


hammhiko

恥を晒して生きていきます。

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント