PHP Progate学習コース Ⅲ
クラスプロパティ
個々のインスタンスの持つデータ(プロパティ)ではなく、クラスの持つデータを「クラスプロパティ」という。
定義方法は staticを用いる。
クラスプロパティにアクセスする方法は、「クラス名」に「::」そして「クラスプロパティ」を用いる。以下。
<?php
class Menu{
public static $count = 4;
//初期値 省略可能
//staticをつけるとクラスプロパティになる
}
echo 'メニュー'.Menu::$count.'品';
?>
//結果:メニュー4品
self
クラス内でクラスプロパティにアクセスする場合、self::$クラスプロパティ名とする。
<?php
class Menu {
public static $count = 0;
public function __construct(){
self::$count++;
}
}
$menu1 = new Menu('CURRY', ...);
$menu2 = new Menu('PASTA', ...);
echo Menu::$count;
//結果2
?>
クラスメソッド
$countのアクセス権をprivateにする。すると、$countへはクラス外からアクセスできなくなる。そこで$countのゲッターを定義。$countのゲッターのように個々のインスタンスのデータに関係なく処理を行いたい場合はクラスメソッドを利用する。こちらもstaticを用いる。 static + クラスメソッド名を用いる。
<?php
class Menu{
private static $count = 0;
// ↑
//クラス外で$countの値を書き換えられると困るので
//privateにする
public static function getCount()
// ↑クラスメソッド
return self::$count;
}
$menu1 = new Menu('CURRY', ...);
$menu2 = new Menu('PASTA', ...);
echo Menu::getCount();
// ↑クラスメソッドの呼び出し
?>
継承
継承を用いて子クラスを定義するときは「extends」を用いて、class 子クラス名 extends 親クラス名 を用いる。
<?php
class Drink extends Menu {
// ↑Menuクラスを継承
$coffee = new Drink('COFFEE', ...);
//親クラスのコンストラクタが実行される
echo $coffee->getName();
//親クラスのメソッドの呼び出し
}
//結果:COFFEE
?>
独自プロパティ・独自メソッド
<?php
class Drink extends Menu {
private $type;
//独自プロパティを定義
public function getType() {
return $this->type;
}
//独自メソッドを定義
public function setType($type) {
$this->type = $type;
//独自メソッドを定義
}
}
$coffee = new Drink('COFEE', ..);
$coffee->setType('ホット')
//DrinkクラスのインスタンスなのでDrinkクラスのメソッドで
呼び出せる
$curry = new Menu('CURRY', ...);
$curry->setType('ホット');
// × 親クラスのインスタンスからは呼び出せない
?>
instanceof
instanceofを用いるとインスタンスがある特定のクラスかどうか判別できる。インスタンス instanceof クラス名 で true falseで判定ができる。
<?php
if($menu instanceof Drink) :?>
}
?>
<p class="menu-item-type"><?php echo $menu->getType() ?></p>
<?php endif?>
オーバーライド
先ほどまではセッターを用いて値をセットしていたが、独自のコンストラクタを定義して$typeの値をセットする。__constructメソッドは親クラスで既に定義されているが、同じ名前のメソッドを子クラスで定義するとメソッドの中身を上書きできる。これをオーバーライドという。
<?php
class Drink extends Menu {
private $type;
public function __construct($name,..,$type){
$this->name = $name;
$this->type = $type;
}
}
?>
protected
子クラスから親クラスのプロパティへアクセスしたい場合は、プロパティのアクセス権を「protected」にする。アクセス権がprotectedのプロパティにはそのクラス内と、継承している子クラスからのみアクセスできる。
<?php
class Menu {
protected $name;
}
class Drink extends Menu {
public function __construct($name,...){
$this->name = $name;
}
}
アクセス権のまとめ
public クラス内→〇 クラス外(子クラス)→〇 クラス外→〇
private クラス内→〇 クラス外(子クラス)→× クラス外→×
protected クラス内→〇 クラス外(子クラス)→〇 クラス外→×
parent
オーバーライドの際に親クラスで定義したメソッドを呼び出す場合はparentを使用する。parent::メソッド名。これを用いることで親クラスと子クラスで重複していたコードをひとまとめにできる。