【PHP】そういうことか！オブジェクト指向！

## まず初めに
まだオブジェクト指向を学習し始めて一週間の僕が備忘録的に残すものなので、何か間違いがありましたら優しく教えていただけますと幸いです:pray_tone1:

また、オブジェクト指向のイメージをつかんでもらうことを目的に書いています。

## 現段階でのオブジェクト指向の理解
ヒト(赤ちゃん)→ウンチする
![baby_role_towel_utsubuse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638476/ee721458-9fdc-24e1-7b40-9ea3aefbcc9e.png)

ヒト(女性)→ウンチする
![otaku_girl_fashion_penlight.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638476/1fe3e7f8-e653-6c12-68ad-ed14a32c60d5.png)

ヒト(おじいさん)→ウンチする
![magonote_ojiisan.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3638476/61e2254a-f814-a572-de9d-38cae4fb1f49.png)

ヒトと言っても上記のように様々ですが、人は人です。オブジェクト指向はこのヒトというモノを表すためにあります。

・ヒトというモノをひとまとめにしたのがオブジェクト指向で言うところの クラス です。

・人は皆、ウンチをします。
　ヒトが実際にすることをまとめたのがオブジェクト指向で言うところの メソッド です。

・ヒトと言っても、赤ちゃん、女性、おじいさんと属性は様々です。
　それを定義するのがオブジェクト指向で言うところの プロパティ です。

要するに、ヒトの基本的な設計図がクラスで、クラス(設計図)の構成要素がメソッド・プロパティです。

## オブジェクト指向のメリットは？

最大のメリットは、仕様変更に対応しやすくなることです！

ではなぜなのか？

先程の例を用いて説明します。

まず、オブジェクト指向を用いなかった場合と用いた場合で、赤ちゃん､女性､おじいさんを作ってみましょう！

・オブジェクト指向を用いなかった場合

ヒト(赤ちゃん)、ヒト(女性)、ヒト(おじいさん)それぞれに対して毎回コードを書く必要があります。
それこそ、うんちをする、という行動は全員するのでその都度同じ処理を書く必要があり、非常に非効率です。

・オブジェクト指向を用いた場合

まず、設計図となるヒトというオブジェクトを定義します。その設計図の中には、うんちをする、という行動もメソッドとして定義してあり、さらに、赤ちゃん、女性、おじいさんといった属性もプロパティとして定義してあります。
そうすることで、後は赤ちゃんという人を作りたい！と思った時にその設計図を元に作り出せばOKです！

ここで、ヒトはご飯を食べる、という仕様変更を加えたいと思いました。

さぁどうでしょう？

・オブジェクト指向を用いなかった場合

ここでも先程と同様、赤ちゃん､女性､おじいさん全てにご飯を食べる処理を追加する必要が出てきます､､､

・オブジェクト指向を用いた場合

設計図となるヒトオブジェクトに、ご飯を食べる処理を追加するだけでOKです！

このように、簡単に仕様変更が出来ます！

## 実際にコードを見てみよう！

### ヒトクラスを作ろう！
```php:class.php
<?php

class Human
{
}
```
クラスを作るのは上記のように、
class クラス名
で出来ます！
ただし、クラス名の一文字目が大文字ということに注意しましょう。

### メソッドを作ろう！
```php:method.php
<?php

class Human
{
    public function unchi()
    {
        echo `うんちをする` . PHP_EOL;
    }
}
```
メソッドは関数と同じ要領です。
publicは一旦無視しておきましょう。
気になる方は下記のリンクから参照してください！
https://www.php.net/manual/ja/language.oop5.visibility.php

### プロパティを作ろう！
```php:puroperty.php
<?php

class Human
{
    private string $humanType;

    public function unchi()
    {
        echo `うんちをする` . PHP_EOL;
    }
}
```
プロパティは変数と同じ要領です。
privateはメソッドを作ろう！で出てきたpublicと同じアクセス権というものです。
stringは型を宣言しています。

とりあえず、ヒトのクラス（設計図）は完成しました！

### これをどうやって使うの？

ヒトの設計図は完成したので、本来の目的である、赤ちゃん、女性、おじいさんを作ってみましょう！

まずは、赤ちゃんから！

```php:createBaby.php
<?php

class Human
{
    private string $humanType;

    public function unchi()
    {
        echo `うんちをする` . PHP_EOL;
    }
}

$baby = new Human();
$baby->unchi();
```

まず、赤ちゃんを作るために、new する！（インスタンス化）。
new クラス名();で設計図を基にした具体的なもの（ここでは、赤ちゃん）ができます。
これだけです！
それを$babyという変数に入れます。

次に、赤ちゃんがうんちをしたくなったのでunchiメソッドを使いたいです。。。
メソッドを呼び出すには、
newした時に入れた変数（ここでは、$baby）->メソッド名（ここでは、unchi()）
をします。
すると、出力結果が、
```
うんちをする
```
となります。

しかし、これでは誰がうんちしたのかわかりません:cry:

なので、その「誰が」という情報を追加してみましょう！

```php:createBaby.php
<?php

class Human
{
    private string $humanType;

    public function __construct($type)
    {
        $this->humanType = $type;
    }

    public function unchi()
    {
        echo $this->humanType . `がうんちをする` . PHP_EOL;
    }
}

$baby = new Human('赤ちゃん');
$baby->unchi();
```

ここで、新たに登場するのが、コンストラクタメソッドです。
```php:createBaby.php
    public function __construct($type)
    {
        $this->humanType = $type;
    }
```
なんそれ？ってなりますよね。

コンストラクタメソッドはインスタンス化（newする）した際に必ず実行されるメソッドのことです。

？？？

具体的に見ていきましょう！

ここでは、赤ちゃんをnewして作った際に、引数に　'赤ちゃん'　を入れています。

その時（赤ちゃんを　newした時＝作った時）に、コンストラクタメソッド発動です！

まず、コンストラクタメソッドの引数　$type　に　'赤ちゃん'　が入ります。

そして、クラス内の　$humanType　に　＄type('赤ちゃん')　が入ります。

ここまでがコンストラクタメソッドの役割です。

unchi()メソッドのようにわざわざ、呼び出さなくても自動で役割を果たしてくれます！

コンストラクト＝構築する

という意味から分かるように、オブジェクト（クラス）の土台を作ってくれるというイメージです。

出力結果は、
```
赤ちゃんがうんちをする
```
となります。

これで「誰が」うんちをするのかがわかるようになりました！

（$this については今後追記します🙇‍♂️）

### では、女性、おじいさんも作ってみましょう！

```php:createHuman.php
<?php

class Human
{
    private string $humanType;

    public function __construct($type)
    {
        $this->humanType = $type;
    }

    public function unchi()
    {
        echo $this->humanType . `がうんちをする` . PHP_EOL;
    }
}

$baby = new Human('赤ちゃん');
$lady = new Human('女性');
$oldman = new Human('おじいさん');

$baby->unchi();
$lady->unchi();
$oldman->unchi();
```

出力結果は、
```
赤ちゃんがうんちをする
女性がうんちをする
おじいさんがうんちをする
```
となります。

あら簡単！

追記したのは４行だけ！
```php:createHuman.php
$lady = new Human('女性');
$oldman = new Human('おじいさん');
$lady->unchi();
$oldman->unchi();
```

ヒトのオブジェクト（クラス＝設計図）を作っておいたら、後はインスタンス化（newする＝色々な人を作る）するだけでOK！