以下の記事で、クラス(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
コメント