忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

PHP クラス(class)のオーバーライドの使い方について・その2


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












PR

コメント

コメントを書く