【PHP】オブジェクト指向

## 概要
本記事はオブジェクト指向の基礎になります。

## オブジェクト指向とは
オブジェクト指向とは、プログラミングを効率化するための手法・考え方になります。
あるプログラムをクラス（概念）という単位でまとめ、クラスを元にオブジェクト（インスタンス）を作成し、インスタンスのやり取りによってプログラムの流れを書いていきます。

例えば、私たち一人ひとりは、人間というクラス（概念）のオブジェクト（インスタンス）になります。そして人間というクラスには、年齢、身長、性別などのデータ（プロパティ）や、歩く、寝る、食べるなどのふるまい（メソッド）が存在しています。

## クラス
オブジェクト指向ではクラスという概念を利用して、そのクラスを元にインスタンスを生成してプログラムを書いていきます。
では、クラスを定義してみましょう。

```php
<?php
　class Human {  ⇦ classというキーワードの後ろにクラス名

  }
?>
```
まだ中身は空っぽですが、これでHumanというクラスが定義できました。
クラス名は、単語の区切りを大文字にして書くパスカルケースという表記方で書いていきます。

クラス名はそのクラスを表すものになります。上記では人間を表すHumanクラスを作成しました。
中括弧の中には、データであるプロパティ、ふるまいを表すメソッド、インスタンス生成時の初期化を行うコンストラクタを書く事ができます。

## プロパティ
プロパティは、インスタンスの状態を表すもので、簡単に言えば変数です。
この変数にアクセス修飾子を指定する必要があります。アクセス修飾子というのは、そのプロパティにクラスの外からでも参照や代入といったアクセスができるのか、クラス内からしかアクセスできないのか、といったことを指定する事ができるものです。
アクセス修飾子は次の三つがあります。

・`public`   　どこからでもアクセス可能
・`private`　　自クラス内のみアクセス可能
・`protected`　　自クラス内と継承先のクラスからアクセス可能

プロパティを定義してみましょう。
```php
<?php
 class Human{
   public $name; 
   private $birthday;
   protected $gender;
 }
?>
```
これでHumanクラスに3つのプロパティを定義する事ができました。
ちなみにクラスに定義したデータのことを、`プロパティ`、`メンバ変数`、`インスタンス変数`、`フィールド`と言ったりしますが全部同じ意味です。
 
## メソッド
メソッドは処理を定義するもので、簡単に言えば関数のことです。
プロパティと同じでメソッドもアクセス修飾子を指定する事ができます。アクセス修飾子を省略した場合は、publicになります。

メソッドを定義してみましょう。
```php
<?php
 class Human{
   public $name; 
   private $birthday;
   protected $gender;
 
   public function walk() {  
     echo '歩きます';
   }
   public function eat() {
     echo '食べます';
   }
}
?>
```
walk,eatというメソッドを定義する事ができました。
メソッドは関数と同じで仮引数をとることができたり、returnして返り値を指定することもできます。
外からメソッドを呼び出したい時などは、publicを指定しましょう。
　
## コンストラクタ　インスタンス生成
クラスからインスタンスを生成する際に最初に実行される特殊なメソッド、それがコンストラクタです。
コンストラクタの利用目的としては主にインスタンスを生成する時の初期化に用いられます。
```php
<?php
 class Human{
   public $name; 
   private $birthday;
   protected $gender;
 
   public function walk() {  
     echo '歩きます';
   }
   public function eat() {
     echo '食べます';
   }
 }

 $human = new Human();  ⇦インスタンス生成
?>
```
クラス名の前にnewというキーワードをつける事で、インスタンスを生成する事ができます。
上記の例では、Humanクラスという概念から、$humanという人を作成したイメージです。
詳しくは、インスタンスが代入された変数が＄humanです。
そして作成した、インスタンスはふるまい（メソッド）を呼び出す事ができます。
```php
<?php
 class Human{
   public $name; 
   private $birthday;
   protected $gender;
 
   public function walk() {  
     echo '歩きます';
   }
   public function eat() {
     echo '食べます';
   }
 }

 $human = new Human();  ⇦インスタンス生成
 $human -> eat();　　⇦ メソッド呼び出し
 $human -> walk();　　⇦ メソッド呼び出し
?>
```
インスタンスが代入された変数の後にシングルアロー、メソッド名（）でメソッドを呼び出す事ができます。
これをブラウザで確認すると、食べます、歩きますと出力されているはずです。

インスタンスを生成する時にnewというキーワードを使いましたが、この時にコンストラクタが実行されています。

Humanクラスにあるプロパティにはまだなにも値が入っていません。そこでコンストラクタを使って値を代入していきます。

```php
<?php
 class Human{
   public $name; 
   private $birthday;
   protected $gender;
 　
　　public function __construct($name, $birthday, $gender) {  ⇦コンストラクタ
     
   }
　　
   public function walk() {  
     echo '歩きます';
   }
   public function eat() {
     echo '食べます';
   }
 }

 $human = new Human('みうら', '1998年5月10日', '男');  ⇦インスタンス生成時にデフォルトのコンストラクタが呼び出される
 $human -> eat();　　
 $human -> walk();　
?>
```
コンストラクタを定義する事で、インスタンス生成時のデフォルトのコンストラクタを上書きする事ができます。
コンストラクタに仮引数を与えて、new Humanにその実引数を書いていきます。
ここで注意ですがコンストラクタの引数の$nameなどの変数は上のプロパティとは別のものになります。
なので、コンストラクタの引数の値をプロパティに代入してあげる必要があります。

### コンストラクタの使用
```php
$human = new Human('みうら', '1998年5月10日', '男');
```

ちなみに、PHPでは特殊なメソッドとしてアンダースコア2つから始まるものが定義されている事があります。
自分でメソッドを定義する時にもアンダースコア2つから始まるメソッドを定義する事ができますが、自分で定義したものなのか、PHPが予め用意しているメソッドなのかの区別がつきにくくなるため、アンダースコア2つからなるメソッドは避けるようにしましょう。
このような関数を`マジックメソッド`と呼びます。

## this
では、プロパティに値を代入していきます。
そこで使うのが$thisです。これは`レシーバー`というインスタンスが入った変数です。
レシーバーというのは、これから作ろうとしているインスタンスのことです。

```php
public function __construct($name, $birthday, $gender) {  
    $this ->name = $name;
    $this ->birtday = $birtday;
    $this ->gender = $gender; 
   }
```
$thisのnameに先ほど与えた実引数を代入しています。

thisは自分自身を表すキーワードです。なので$this ->nameなどはそのインスタンスのプロパティを表すものになっています。
シングルアローを使っていますが、これは「の」を意味する接続詞だと考えるとわかりやすいです。