継承 サブクラスとオーバーライドとparentキーワード
サブクラスについて勉強してみた。
subclass.php
<?php
$obj = new MySubClass('PEAR'); //サブクラスのshowDataメソッドに値を入力。
print($obj->showData());
class MyClass {
protected $data; //サブクラスまで参照可能なメンバ変数
//コンストラクタによるメンバ変数の初期化
public function __construct($data){
$this->data = $data;
}
public function showData(){
return "入力値は「" . $this->data . "」です。";
}
}
class MySubClass extends MyClass {
//showDataメソッドをオーバーライド
public function showData(){
return "だがしかし、入力値は「" . $this->data . "」です。";
}
}
?>
実行結果
だがしかし、入力値は「PEAR」です。
既存のクラスとほとんど同一の性能を持ったクラスを定義したい場合に、そのクラスを一から定義すると無駄なので、そういった場合にクラスを継承するみたいです。
ちなみに、おおもとのクラスを「スーパークラス」、継承したクラスを「サブクラス」とかいうふうに呼ぶ。
サブクラスを宣言する際は、
class サブクラス名 extends スーパークラス名
という感じで。
ちなみに上の例では、サブクラスを宣言した際、
protected $data;
public function __construct($data){
$this->data = $data;
}
スーパークラスのこの部分までは、そのまま利用しており、
更にスーパークラスのshowDataメゾッド
public function showData(){
return "入力値は「" . $this->data . "」です。";
}
この部分を、サブクラスの
public function showData(){
return "だがしかし、入力値は「" . $this->data . "」です。";
}
で、オーバーライド(上書き)している。
つまりこの場合、スーパークラスを普通に実行した場合、実行結果が
「入力値は「PEAR」です。」
となったのを、サブクラスを実行させることにより、スーパークラスの一部がオーバーライドされ、実行結果が
「だがしかし、入力値は「PEAR」です。」
と変化することになる。
また、上記のようにスーパークラスのメソッドを少しだけ改変したいと思った場合だと、「parentキーワード」というものが便利で、上記サブクラスのオーバーライドした部分を
public function showData(){
return "だがしかし、入力値は「" . $this->data . "」です。";
}
↓
public function showData(){
return "だがしかし、" . parent::showData();
}
このように変えると、スーパークラスのメソッドの戻り値を利用しつつ、必要な部分だけ変更することが出来、便利。