オブジェクト指向のクラスの書き方

#オブジェクト指向とは？

プログラムという仮想の世界を、現実世界の実体（オブジェクト）に合わせて、プログラムを書いていく、という考え方のこと。
その考え方に基づいてプログラムを書いていくことで、保守性が高くなる。

<br>
例えばゲームに登場させるモンスターを30体用意しなきゃいけない、ということになったとき、
30体全部を一体ずつ作成するのは大変です。

#オブジェクト指向で書かないとどうなる？

今学んでいるのがPHP言語なのでPHPで以下の説明コードを書いていきます。

一般的なゲームでは、

モンスターの名前、属性、見た目、HP、攻撃力、防御力

などなどが必要です。

それらを連想配列で用意していきます。

```php

// モンスターたち格納用配列
$monsters = array();

$monsters[] = array(
   'name' => ‘ファイアーマン’,
   ‘attribute’ => ‘火’,
   'hp' => 100,
   'img' => 'monster01.png',
   'attack' => mt_rand(20, 40)
　’defense’ => mt_rand(50,70)
);
$monsters[] = array(
   'name' => ‘ウォーターマン’,
   ‘attribute’ => ‘水’,
   'hp' => 200,
   'img' => 'monster02.png',
   'attack' => mt_rand(30, 80)
　’defense’ => mt_rand(20,40)
);
$monsters[] = array(
   'name' => ‘ウッドマン’,
   ‘attribute’ => ‘木’,
   'hp' => 300,
   'img' => 'monster03.png',
   'attack' => mt_rand(10, 30)
　’defense’ => mt_rand(90,150)
);

//以下略
```

こんな風に30体作っていくことになると思うのですが、これを抽象化して

**「共通点を集めて、1つの雛形（テンプレート）を作れば保守性が上がるんじゃない？」**

ということが、オブジェクトとして考えるってことだと今の所理解しています。

==============================================

※**保守性が高い**、というのは以下の意味だと思っています。

 - あとから読んだときにわかりやすい
 - 変更しやすい、修正しやすい
 - バグを生みにくい

=============================================

#オブジェクト指向でモンスターのクラスを作成【準備編】

モンスターの共通点は今回の例でいうと

・名前
・タイプ（火タイプとか、水タイプとか）
・見た目
・HP
・攻撃力
・防御力

になります。
これらはプロパティ（属性）というもので、
動きがあるものはメソッド（動き）と呼ばれます。

攻撃はプロパティだけど、攻撃するはメソッド。
足が3本はプロパティだけど、走るはメソッド。

という感じです。



##①これらを予めモンスターの設計図として、テンプレートとして準備します。
このモンスターの共通点をクラスに入れ込みます。
この設計図が、クラスになります。


##②クラスの中にコンストラクタを作成します。
コンストラクタは、クラスをインスタンス化した時に実行されるメソッド。
※newしたときにプロパティを設定したい場合、適用する関数（マジックメソッド）

##③この設計図を元に、インスタンスを作成します。
僕のイメージですが、インスタンスの作成って
モンスター工場で、設計図を元にガッチャン！って金型でプレスして作るようなイメージでいるんですが
とにかく設計図を元に、インスタンスというものを作ります。
このインスタンスを作ることを「実体化」と言います。


#オブジェクト指向でモンスターのクラスを作成【コード編】
実際のコードは

```php
// モンスターたち格納用
$monsters = array();

// クラス（設計図）の作成
class Monster{
  // プロパティ
  public $name; 
  public $attribute;
  public $hp;
  public $img;
  public $attack; 
  public $defense; 

  // コンストラクタ
   public function __construct($name, $attribute, $hp, $img, $attack,$defense){
     // -> : アロー演算子は左辺から右辺を取り出す演算子
     $this->name = $name;
     $this->attribute = $attribute;
     $this->hp = $hp;
     $this->img = $img;
     $this->attack = $attack;
     $this->defense = $defense;
   }
 }
```

という感じです。
ひとまずこれでモンスターの設計図は出来上がり！
※アクセス権は一旦無視して作っています。


さて、次にインスタンスの作成ですが、

```php

// インスタンス生成
$monsters[] = new Monster('ファイアーマン', 100, 'monster01.png', mt_rand(20, 40),mt_rand(50,70));
$monsters[] = new Monster('ウォーターマン', 200, 'monster02.png', mt_rand(30, 80),mt_rand(20,40));
$monsters[] = new Monster('ウッドマン', 300, 'monster03.png', mt_rand(10, 30),mt_rand(90,150));
```

という風になります。
【注意！】インスタンス生成時には、必ずnewを入れないといけません。

これで原型は出来上がり。


モンスター工場で、設計図を元にガッチャン！ってプレスしてモンスターが生まれました。



#ここまでのまとめ

 - オブジェクトを作るには、設計図が必要です。
 - その設計図は「クラス」と言います。
 - クラスを元に出来上がるオブジェクトがインスタンス。
 - クラスの中にコンストラクタを入れれば、インスタンス生成時に呼び出される。
 - クラスにはプロパティと、メソッドを入れることができる。
 - オブジェクト指向で作っておくと、後で修正や変更がしやすい。<br>
（あとからやっぱり「MP」と「魔法攻撃する」を入れたいときには、MPのプロパティと魔法攻撃のメソッドをクラスに足すだけでインスタンスがそのプロパティとメソッドを持てる）



#感想
オモシロイと思ったのは
何かオブジェクトを作ろうと思ったとき、連想配列でも出来るんだ！ということです。
ただ連想配列のkey&valueの1セット1セットが独立しているわけではなく、全部揃ってそのオブジェクトを表している、、、という表現で合っているんでしょうか？

連想配列の箱にただ順番にデータが入っているわけではなく、意味があってそのデータが入っているんですよね。
プロパティの情報が全部合わさって、一つの意味のあるクラスが出来上がる。というような。

奥が深いです！

今回は以上です。