【学習記録:108日目】参照渡し×プログラミング

勉強記録

こんにちは!アラサーOLのぱるこです。

現在、webプログラマーを目指して、プログラミングの勉強中です。

そんな今回のブログは、4ヶ月目(前半)の記録です。

寝渡しと参照渡しについて

今回のブログでは、昨日アウトプットをしていて混乱した、「値渡しと参照渡し」について、
私の頭を整理するためにまとめていきます。

配列とインスタンスをコピって実験!

配列はコピーできる!!

$foodsという変数には、ハンバーガー・・・などが入った配列が入っています。
それを、$menuという変数にコピーします!!

$foods = ['ハンバーガー', 'チキンクリスプ', 'ビックマック', 'えびフィレオ'];

//コピーする
$menu = $foods;

コピーした$menu[1]に「フィレオフィッシュ」を代入すると、
$foodsの[1]は、チキンクリスプのままで、
$menuの[1]は、フィレオフィッシュに変更になっていることがわかります。

$menu[1] = 'フィレオフィッシュ';

echo $foods[1]; //「チキンクリスプ」出力
echo $menu[1]; //「フィレオフィッシュ」出力

無事、コピーできました!

そもそも配列がよくわからない〜!!って方は、こちらの記事をぜひご覧ください!

インスタンスはコピーできるけど、、、

Foodクラス(設計図)から、インスタンスを生成したものを変数$humbergerに代入し、それを配列の時と同様に変数$chickencrispにコピーしてみました。

class Food{
  public $name;
  public $price;
  public function __construct($name, $price){
    $this->name = $name;
    $this->price = $price;
  }
}

//インスタンスを生成
$humberger = new Food('ハンバーガー', 100);

// コピーする
$chickencrisp = $humberger;

そして、$chickencrispの名前だけを「チキンクリスプ」に変えたいと思います。

$chickencrisp->name = 'チキンクリスプ';
echo $chickencrisp->name;   
//「チキンクリスプ」と出力

念のために、$humbergerの名前もみてみましょう。

echo $humberger->name;   
//こちらも「チキンクリスプ」と出力

・・・(驚)
こっちも変わっとるやん!!!

何故ならば、インスタンスって参照渡しだからです。
顧問も動画の中でおっしゃってました。(反省)

値渡しと参照渡しの違いのおさらい

まず、ウェブカツで習ったことのおさらい。
関数の引数には「寝渡し」と「参照渡し」という渡し方があり、参照渡し解説時の動画の中で、仰られた下記の言葉がキーワードとなります。

参照渡しの場合は、変数=メモリの「番地」を渡してあげる。

ウェブカツ オブジェクト指向部より

値渡しとは

値渡しって何?
function myFunc($tower){
 $tower = 1                 
}
$house = 5;                  
myFunc($house);                

echo $house;  //「5」が出力された!

変数$houseの値は、「5」です。
myFuncという関数の引数に、変数$houseを渡しても、元の変数には何も影響ありません。
$houseを出力してみると値は「1」ではなく、「5」のままです。

このように、変数の値には影響を受けない渡し方のこと値渡しと言います。

キーワードの「番地」ですが、
値渡しの場合は、変数の保存先である番地は渡してあげません。
もし番地が同じであれば、値も同じになるはずだからです。

つまり値渡しとは、ただ「5」という値を渡しているだけです。
なので、いくら値を変えても元々の変数には影響しません。

参照渡しとは

参照渡しって何?
function myFunc2(&$tower){  
  $tower = 1;  
} 
$house = 5;
myFunc2($house); 
echo $house;  //$houseの値は、1が出力された!

myFunc2という関数の引数$towerの前に、「&(アンド)」をつけることで、参照渡しという渡し方ができます。参照渡しをすることで、関数の中で1を代入した時にmyFunc関数の引数として渡した変数$houseの値も変更されてしまいます。

なぜ、元々の変数$houseが変わってしまうのか???
参照渡しではキーワードの「番地」を渡しているからです。

つまり、$houseの番地をそのまま渡しているので、関数によって値を変えたら、当然同じ番地にある値なので上書きされてしまいます。なので、元々の変数の値も変わってしまいます。

そういうことだったんですね。
今日やっと参照渡しについて、ちゃんと理解できました。(遅)!!!

インスタンスも参照渡し

なぜ値が同じなのか??

参照渡しについてわかったことで、本題に戻ります。
なぜ、コピーした$chickencrispのインスタンスだけ、名前が「チキンクリスプ」に変わらなかったのか?

そう、インスタンスも参照渡しだからです。
これも顧問仰ってました。(反省)

class Food{
  public $name;
  public $price;
  public function __construct($name, $price){
    $this->name = $name;
    $this->price = $price;
  }
}

$humberger = new Food('ハンバーガー', 100);

// コピーする(番地までコピーしちゃった!)
$chickencrisp = $humberger;

$chickencrisp->name = 'チキンクリスプ';
echo $chickencrisp->name;   //「チキンクリスプ」と出力
echo $humberger->name;   //「チキンクリスプ」と出力

つまり、$humbergerのインスタンスを$chickencrispにコピーした時に、番地までコピーされてしまったいたのが原因です。インスタンス名は異なるけど、番地は同じなので、値は上書きされてしまいます。

インスタンスの中にある名前や値段を変えても、同じ番地の物を使っている限り$humbergerと$chickencrispはいつまでも値は同じなんですね!!なるほど!!

インスタンスのコピーはcloneを使う

$chickencrisp = clone $humberger;
$chickencrisp->name = 'チキンクリスプ';
echo $chickencrisp->name;   //「チキンクリスプ」と出力
echo $humberger->name;   //「ハンバーガー」と出力

無事インスタンスをコピーできました!
アウトプット中、クローンに出会えたことで、基本である参照渡しについて理解できました。

今回は、こちらのブログを参考にさせて頂きました。

初心者向けオンラインプログラミング学習
大手スクール生徒や現役エンジニアが多数学び直している「実務レベル」に特化した「稼ぐ」ためのプログラミングスクール

プログラミング学習報告(4ヶ月目(前半))

それでは、プログラミング学習の振り返りです。

私は、平日は10時〜19時までの会社勤務なので、
平日は4時間、土日祝日は6時間を勉強時間の目標としています。
現在は、子供や介護する方もいないので、勤務時間以外は自由に使えます。
15時間 も使えます!!!!(驚)

勉強時間の結果と目標(15日間)

まず、 4ヶ月目(前半)のプログラミングの学習時間の結果です。

目標勉強時間 平日:4h、土日祝:6h

8/31分は含んでおりません。

勉強時間に関しては、自習室にも通い始めたことで、習慣化できてきたように思います。
3ヶ月継続すると全然苦ではなくなりました。むしろ、プログラミングする時間が楽しくなってきました。

タイトルとURLをコピーしました