以下の記事で、クラス(class)の使い方について説明しましたが、その時は親クラスのメソッドを、 子クラスで同じメソッド名で宣言することでオーバーライドができることを記しました。
⇒PHP クラス(class)の使い方について
そこで、今回はクラス(class)のオーバーライドの使い方について更に詳しく説明します。
子クラスでオーバーライドしたメソッドですが、親クラスから呼出すことができます。
これは、少し変な感じですが、子クラスでインスタンスを生成し、 そのインスタンスから子クラスのオーバーライド・メソッドを呼出している親クラスのメソッドを呼び出せます。 取敢えず、簡単な例を以下に示します。
<?php // 継承の基となる親クラス class cParent { // テスト関数1 public function func1() { echo "cParent_func1<br>\n"; $this->func2(); // 「テスト関数2」実行 } // テスト関数2 public function func2() { echo "cParent_func2<br>\n"; } } // [cParent]から派生した子クラス class cChild extends cParent { // オーバーライド・テスト関数2 public function func2() { echo "cChild_func2<br>\n"; } } // [cParent]クラスの生成 $insParent = new cParent(); // テスト関数1の実行 $insParent->func1(); // [cChild]クラスの生成 $insChild = new cChild(); // テスト関数1の実行 $insChild->func1(); ?>
親クラスに「func1()」「func2()」のメソッドを宣言し、「func1()」の中で自分の「func2()」を呼出しています。 また、親クラスから派生した子クラスに「func2()」というメソッドをオーバーライド宣言しています。
親クラスを生成し「func1()」を実行し、子クラスを生成し「func1()」を実行しています。
これを実行するとブラウザに以下の様に表示されます。
cParent_func1 cParent_func2 cParent_func1 cChild_func2
子クラスを生成し「func1()」を実行した場合は、親クラスの「func2()」を実行するのではなく、 子クラスの「func2()」が実行されています。オーバーライドの結果が出ていると思います。
子クラスでオーバーライドすることで、親クラスの元の性質と異なる処理を宣言できます。
異なる子クラスを宣言すれば、親は一緒でも異なる処理を実行するクラスの宣言ができます。以下のソースを見て下さい。
<?php // 継承の基となる親クラス class cParent { // テスト関数1 public function func1() { echo "cParent_func1<br>\n"; $this->func2(); } // テスト関数2 public function func2() { echo "cParent_func2<br>\n"; } } // [cParent]から派生した子クラスその1 class cChild1 extends cParent { // オーバーライド・テスト関数2 public function func2() { echo "cChild1_func2<br>\n"; } } // [cParent]から派生した子クラスその2 class cChild2 extends cParent { // オーバーライド・テスト関数2 public function func2() { echo "cChild2_func2<br>\n"; } } // [cChild1]クラスの生成 $insChild1 = new cChild1(); // テスト関数1の実行 $insChild1->func1(); // [cChild2]クラスの生成 $insChild2 = new cChild2(); // テスト関数1の実行 $insChild2->func1(); ?>
これを実行するとブラウザに以下の様に表示されます。
cParent_func1 cChild1_func2 cParent_func1 cChild2_func2
さらに、子クラスの中で、親クラスの処理のも必要な場合は parent:: を使って親クラスのメソッドを呼び出します。
<?php // 継承の基となる親クラス class cParent { // テスト関数1 public function func1() { echo "cParent_func1<br>\n"; $this->func2(); } // テスト関数2 public function func2() { echo "cParent_func2<br>\n"; } } // [cParent]から派生した子クラスその1 class cChild1 extends cParent { // オーバーライド・テスト関数2 public function func2() { parent::func2(); echo "cChild1_func2<br>\n"; } } // [cParent]から派生した子クラスその2 class cChild2 extends cParent { // オーバーライド・テスト関数2 public function func2() { parent::func2(); echo "cChild2_func2<br>\n"; } } // [cChild1]クラスの生成 $insChild1 = new cChild1(); // テスト関数1の実行 $insChild1->func1(); // [cChild2]クラスの生成 $insChild2 = new cChild2(); // テスト関数1の実行 $insChild2->func1(); ?>これを実行するとブラウザに以下の様に表示されます。
cParent_func1 cParent_func2 cChild1_func2 cParent_func1 cParent_func2 cChild2_func2
コメント