PHP基礎メモその3

#クラスプロパティ
個々のインスタンスが持つデータ（プロパティ）ではなく、クラスが持つデータをクラスプロパティという。
クラスプロパティは『static』を用いて定義する。
クラスプロパティにアクセスする場合は『クラス名::クラスプロパティ名』のように『::』を用いる。
>```php
class Menu {
  // staticをつけるとクラスプロパティになる
  public static $count = 4;
}
// クラスプロパティにアクセス
echo 'メニュー'.Menu::$count.'品';
```

結果
メニュー4品

#self
クラス内でクラスプロパティにアクセスする際は『self』という特殊な変数を用いる。
selfは、クラスの中で使うとそのクラス自身のことを指し、『self::＄クラスプロパティ名』のように使う。
このselfを用いてコンストラクタの中でクラスプロパティ＄countの値を変更する。
>```php
class Menu {
  public static $count = 0;
  public function __construct(...) {
  ...
    self::$count++;
    // self = Menuクラス
  }
}
```
```php
$menu1 = new Menu('CURRY', ...);
$menu2 = new Menu('PASTA', ...);
// インスタンスが生成される度に、コンストラクタの中でクラスプロパティ$countに1を足している
echo Menu::$count;
```

結果
2

#クラスメソッド
＄countのゲッターのように、個々のインスタンスのデータに関係ない処理を行いたい時には
『クラスメソッド』を用いる。クラスメソッドは、『static』を用いて定義し、『クラス名::クラスメソッド名』のように呼び出す。
>```php
class Menu {
  private static $count = 0;
  // クラス外で$countが書き換えられないようにprivateにする
  ...
  // クラスメソッドの定義
  public static function getCount() {
    return self::$count;
  }
}
```
```php
$menu1 = new Menu('CURRY', ...);
$menu2 = new Menu('PASTA', ...);
>
// クラスメソッドの呼び出し
echo Menu::getCount();
```

結果
2

#クラスの継承
すでに定義されているクラスのプロパティやメソッドを別のクラスに引き継ぐことを『継承』という。
引き継がれる元のクラスを親クラス継承して新しくできたクラスを子クラスという。
子クラスは親クラスのプロパティやメソッドを全て引き継いだ上で、独自の機能を追加できる。

継承の書き方
>```php
class 親クラス名 {
  ...
}
```
```php
class 子クラス名 extends 親クラス名 {
  ...
}
```

継承の使用例
>```php
class Menu {
  ...
  public function __construct($name, ...) {
    $this->name = $name;
    ...
  }
  public function getName() {
    return $this->name;
  }
  ...
}
```
```php
// Menuクラスを継承したDrinkクラスを作成
class Drink extends Menu {
}
>
// 親クラスのコンストラクタが実行される
$coffee = new Drink('COFFEE', ...);
>
// 親クラスのメソッドの呼び出し
echo $coffee->getName();
```

結果
COFFEE

#子クラスに独自のメソッドを定義する
>```php
class Drink extends Menu {
  private $type;
>
  public function getType() {
    return $this->type;
  }
>
  public function setTtpe($type) {
    $this->type = $type;
  }
}
```
```php
$coffee = new Drink('COFFEE', ...);
$coffee->setType('ホット');
>
// 親クラスのインスタンスからは呼び出されない
$curry = new Menu('CURRY', ...);
$curry->setType('ホット');
```

#instanceof
『instanceof』はあるインスタンスが特定のクラスのインスタンスであるかどうかを判別する時に用いる。
『インスタンス instanceof クラス名』のようにすると、インスタンスが指定したクラスのインスタンスである場合は『true』、
そうでない場合は『false』になる。
>```php
$coffee = new Drink('COFFEE', ...);
>
if ($coffee instanceof Drink) {
  echo $coffee->getName().'はDrinkクラスである';
}
>
if ($coffee instanceof Food) {
  echo $coffee->getName().'はFoodクラスのインスタンスである';
}
```

結果
COFFEEはDrinkクラスのインスタンスである

#protected
親クラスにすでに定義されてる同じ名前のメソッドを子クラスで定義するとメソッドの中身を上書きすることができる。
このようなメソッドの上書きを『オーバーライド』という。

子クラスから親クラスで定義したプロパティにアクセスしたい場合は、そのプロパティのアクセス権を『protected』にする。
アクセス権がprotectedのプロパティには、そのクラス内からと、そのクラスを継承している子クラス内からのみアクセスできる。

>```php:親クラス
class Menu {
  protected $name;
  ...
}
```
```php:子クラス
class Drink extends Menu {
  ...
  public function __construct($name,...) {
    $this->name = $name;
  }
}

#parent
オーバークラスの際に親クラスで定義したメソッドを呼び出したいときには、『parent』を用いて『parent::メソッド名』のように呼び出す。
>```php:親クラス
class Menu {
  private $name;
  ...
  public function __construct($name, $price, $image) {
    $this->name = $name;
    $this->price = $price;
    $this->image = $image;
    self::$count++;
  }
}
```
```php:子クラス
class Drink extends Menu {
  ...
  public function __construct($name, $price, $image, $type) {
    // 親クラスの__constructメソッドを呼び出す
    parent::__construct($name, $type, $image);
    $this->type = $type;
  }
}
$coffee = new Drink('COFFEE', ..., 'ホット');
echo $drink->getType();
```

結果
ホット