【PHP】クラスの基本 | インスタンス | プロパティとメソッド | オブジェクト指向

#phpのクラスについて

phpにおけるクラスの考え方と、クラスの中にあるプロパティとメソッド、さらにはインスタンスの生成、そして根本のオブジェクト指向について、初心者の方でも分かりやすく丁寧に解説します。

#オブジェクト指向について

まずはオブジェクト指向について触れます。
phpは***オブジェクト指向***のプログラミング言語です。

まずは初学者にとっては、オブジェクト指向って何？
という疑問を抱く人も多いとおもいます。
私もそうでした。最初は誰しもが疑問に持つポイントだと思います。

簡単に言うと、オブジェクトという一つの型を決める(作る)ことによって、
いつでもその型から、同じものを複製したり、あるいは似たものを複製することが出来ます。

プログラムを効率的に書くためにある仕組みです。

##具体例

例えば、phpでスタッフを登録したいとします。居酒屋でもファーストフードでもカラオケでも構いません。

スタッフには名前と年齢があるとします。

このスタッフをプログラムで作成していくために、皆さんはどんなふうにすれば効率良くコードが書けると思いますか？

1. 連想配列を作成して、配列の中に入れていく
2. データベースに登録していく
3. クラスとして定義し、インスタンスを作成する

どれも一長一短で正解です。
そのプログラムの規模や内容、更新頻度などによって、いずれかを選択することになると思いますが。
今回はこちらのやり方で、解説しようと思います。

```
3. クラスとして定義し、インスタンスを作成する
```

#クラス class

クラスには、プロパティとメソッドというものがあります。
最初は全くイメージもつかめないと思いますが、何も難しく考える必要はありません。

プロパティとはクラス内で定める***変数***で、メソッドは***関数***です。
クラスを理解する上では必須の内容なので、以下に詳しく書いていきます。

##プロパティ

まずはプロパティについて例を挙げて考えてみましょう。

スタッフというクラス(型)の中に、名前と年齢があるとします。

| name | age |
|:----:|:----:|
| 田中 | 18 |
| 佐藤 | 22 | 
| 山本 | 34 |    

田中というnameの人は、ageが18なわけです。
そのままですね。

言い換えると、
一番はじめに、スタッフというクラスに、nameとageというプロパティがあるよって宣言してあげることで、あとあと、簡単にスタッフを追加してあげられる仕組みを作れるのです。

###実際にコードで確認します

```index.php
<?php

// Staffというクラス(型)を宣言。クラスの1文字目は大文字
class Staff {

  // property
  public $name;
  public $age;

}

//クラスStaffのインスタンスを作成
$tanaka = new Staff;

//インスタンス名->プロパティ名  ※プロパティの"$"はつけない
//tanakaというインスタンスのプロパティ$nameに、tanakaを挿入。
$tanaka->name = "tanaka";

echo $tanaka->name; // tanaka
```

###ポイント

クラスを宣言しておくことで、new演算子(new)を使い、Staffのインスタンスを作ることができます。インスタンスは、クラスで定義したプロパティを受け継いでいるもの(すなわちnameとageという変数が宣言された状態)を指します。

プロパティを宣言しておくことで、アロー演算子(->)で、そのクラス(インスタンス)のプロパティに値を入れることが出来るようになります。


##コンストラクター constructor

これは後述するメソッドの一種であります。
クラスを作る上で、だいたい使われるものなので理解しましょう。
インスタンス作成時に実行される関数と覚えてください。

書き方は決まってるので覚えるだけです。
`public function __construct(インスタンス作成時に渡される引数)`

###実際にコードで確認します

```index2.php
<?php

// Staffというクラス(型)を宣言。クラスの1文字目は大文字
class Staff {

  // property
  public $name;
  public $age;

  // constructor
  public function __construct($name) {
    $this->name = $name;
  }

}

//クラスStaffのインスタンスを作成。(引数で$nameに渡してあげます。)
$tanaka = new Staff("tanaka");

//index.phpで書いていた下記が必要なくなります。
//$tanaka->name = "tanaka";

echo $tanaka->name; // tanaka
```

###ポイント

コンストラクタを決めておくことで、引数で値を受け渡し、プロパティにそのまま代入することができます。
インスタンスを作成した時に***必ず***実行されるのがこのコンストラクタです。
ちなみに今回は、引数を変数nameとして受け取っていますが、これはプロパティの$nameとは違うものです。
そのため、index2.phpは下記のindex3.phpを全く一緒の結果になります。

```index3.php
<?php

// Staffというクラス(型)を宣言。クラスの1文字目は大文字
class Staff {

  // property
  public $name;
  public $age;

  // constructor
  public function __construct($staff_name) {
    $this->name = $staff_name;
  }

}

//クラスStaffのインスタンスを作成。(引数で$staff_nameに渡してあげます。)
$tanaka = new Staff("tanaka");

//index.phpで書いていた下記が必要なくなります。
//$tanaka->name = "tanaka";

echo $tanaka->name; // tanaka
```


##メソッド

次にメソッドをみてみましょう。いわゆる関数ですね。プロパティの変数のように、ただ値を入れるだけでなく、簡単な機能がついているというニュアンスで理解しましょう。

###実際にコードで確認します

```index4.php
<?php

// Staffというクラス(型)を宣言。クラスの1文字目は大文字
class Staff {

  // property
  public $name;
  public $age;

  // constructor
  public function __construct($name) {
    $this->name = $name;
  }

  // method
  public function Hello() {
    echo "hi, i am $this->name!";
  }

}

//クラスStaffのインスタンスを作成。(引数で$nameを入れてあげます。)
$tanaka = new Staff("tanaka");

echo $tanaka->name; // tanaka
$tanaka->Hello(); // hi, i am tanaka!
```

###ポイント

メソッドとしてHelloを宣言することで、その処理が簡単に実行できているのが分かると思います。
今回は一個のインスタンスしか作成していないので、わかりづらいですが、何個も同じようなスタッフを登録することを考えた場合、はじめにメソッドを決めておくだけで、
`インスタンス名->メソッド名;`
同じような処理をこの1文で、出来るので大きなサイトになる上では欠かせない機能になります。

#まとめ

クラスを宣言し、プロパティとメソッドさらにはコンストラクタを宣言してあげ、インスタンスで複製を作るという基本形を理解出来れば、後は応用していくだけです。

ここまでがマストな考えなので、まずは理解しましょう。
実際に自分でコードを書いたり改造することで理解も深まるはずです。

次回は、親クラスと小クラスの考えについて継承や、権限について更新していこうと思います。