【PHP】メソッドのオーバーライドについて
前回はクラスの継承について記述しました。クラスの継承はそのままでは単にクラスをコピーしただけです。継承したクラスのメソッドや変数をオーバーライドすることによって、親クラスから基本的な変数やメソッドを継承しつつ、別の機能を持った子クラスを作成することができます。
オーバーライドとは
メソッドの「オーバーライド」とは継承したクラスのメソッドの再定義を行うことです。親クラスから継承したメソッドを上書き、または追加していくことで効率よく別のクラスを作成していくことができます。
サンプルコードを例に見てみましょう。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<?php class Player { //クラスを宣言 public $name; //「name」変数を宣言 public $hp; //「hp」変数を宣言 public $mp; //「mp」変数を宣言 public function __construct($name , $hp , $mp){ //コンストラクタ(インスタンス化した際の初期値入力設定) $this->name = $name; //作成するオブジェクトの「name」項目に変数「$a」を代入する $this->hp = $hp; //作成するオブジェクトの「hp」項目に変数「$b」を代入する $this->mp = $mp; //作成するオブジェクトの「name」項目に変数「$c」を代入する echo $this->name."さん、この世界にようこそ!<br>"; } public function denote_hp(){ //プレイヤーのHPを表示するメソッド echo $this->name."のHPは".$this->hp."です。<br>"; } public function denote_mp(){ //プレイヤーのMPを表示するメソッド echo $this->name."のMPは".$this->mp."です。<br>"; } } class Copy extends Player{ //「Player」クラスを継承した「Copy」クラスを作成 } $tanaka = new Copy("tanaka" , 50 , 20); //「Copy」クラスから「$tanaka」オブジェクトを作成し、各項目に初期値を設定する $suzuki = new Copy("suzuki" , 75 , 5); //「Copy」クラスから「$suzuki」オブジェクトを作成し、各項目に初期値を設定する $tanaka->denote_hp(); //「$tanaka」のHPをメソッド「denote_hp」で表示する $suzuki->denote_mp(); //「$suzuki」のMPをメソッド「denote_mp」で表示する ?> |
「Player」クラスを継承した「Copy」クラスを作成し、「Copy」クラスから「$tanaka」と「$suzuki」というオブジェクトを作成します。そして「denote_hp()」、「denote_mp()」というメソッドを呼び出し、「$tanaka」のHPを表示し、「$suzuki」のMPを表示します。以下が実行結果になります。
「Copy」クラスは親クラスである「Player」クラスを継承している為、「Player」クラスのメソッドを使用できます。無事に表示できていますね。
オーバーライドの方法
ここから「Copy」クラスの「denote_hp()」、「denote_mp()」メソッドをオーバーライドによって再定義したいと思います。
オーバーライドの方法は簡単で、「子クラス内に同じメソッド名で処理を記述する」だけです。今回はインスタンスの「HPとMPを100増加させて表示する」メソッドを再定義してみます。「Copy」クラス内に以下のコードを記述します。
|
1 2 3 4 5 6 7 8 9 10 |
class Copy extends Player{ //「Player」クラスを継承した「Copy」クラスを作成 public function denote_hp(){ //プレイヤーのHPを表示するメソッド $this->hp += 100; //HPを100増加させる echo $this->name."のHPは".$this->hp."です。<br>"; } public function denote_mp(){ //プレイヤーのMPを表示するメソッド $this->mp += 100; //MPを100増加させる echo $this->name."のMPは".$this->mp."です。<br>"; } } |
この様に継承した子クラスに、親クラスと同じメソッド名で処理内容を記述することでオーバーライドすることができます。
完成形と実行結果を見てみます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?php class Player { //クラスを宣言 public $name; //「name」変数を宣言 public $hp; //「hp」変数を宣言 public $mp; //「mp」変数を宣言 public function __construct($name , $hp , $mp){ //コンストラクタ(インスタンス化した際の初期値入力設定) $this->name = $name; //作成するオブジェクトの「name」項目に変数「$a」を代入する $this->hp = $hp; //作成するオブジェクトの「hp」項目に変数「$b」を代入する $this->mp = $mp; //作成するオブジェクトの「name」項目に変数「$c」を代入する echo $this->name."さん、この世界にようこそ!<br>"; } public function denote_hp(){ //プレイヤーのHPを表示するメソッド echo $this->name."のHPは".$this->hp."です。<br>"; } public function denote_mp(){ //プレイヤーのMPを表示するメソッド echo $this->name."のMPは".$this->mp."です。<br>"; } } class Copy extends Player{ //「Player」クラスを継承した「Copy」クラスを作成 public function denote_hp(){ //プレイヤーのHPを表示するメソッド $this->hp += 100; //HPを100増加させる echo $this->name."のHPは".$this->hp."です。<br>"; } public function denote_mp(){ //プレイヤーのMPを表示するメソッド $this->mp += 100; //MPを100増加させる echo $this->name."のMPは".$this->mp."です。<br>"; } } $tanaka = new Copy("tanaka" , 50 , 20); //「Copy」クラスから「$tanaka」オブジェクトを作成し、各項目に初期値を設定する $suzuki = new Copy("suzuki" , 75 , 5); //「Copy」クラスから「$suzuki」オブジェクトを作成し、各項目に初期値を設定する $tanaka->denote_hp(); //「$tanaka」のHPをメソッド「denote_hp」で表示する $suzuki->denote_mp(); //「$suzuki」のMPをメソッド「denote_mp」で表示する ?> |
無事に各数値が100増加して表示され、オーバーライドが正常に行われていることが確認できます。
ちなみに今回はメソッドを上書きしましたが、新たなメソッドを追加していくことで子クラスだけのメソッドを作成することも可能です。
まとめ
- 親クラスを継承した子クラスの変数やメソッドを再定義することをオーバーライドという
- 子クラス内に親クラスと同じメソッド名で処理を記述することで、処理内容をオーバーライド(上書き)することができる

