2013年3月26日火曜日

PHP abstract修飾子

abstract修飾子

abstract修飾子をつけることができるのはクラスとメソッドのみです。

クラスにabstract修飾子をつけると、そのクラスはインスタンス化できません。
abstractクラスにabstractメソッドを含める必要はありません。
<?php
//親クラス(抽象クラス)
abstract class ParentClass {
    public function ParentMethod(){
        print('ParentMethod</br>');
    }
}
//子クラス
class ChildClass extends ParentClass{
}>


//使用例

//ParentClassはインスタンス化できない。
//$parent = new ParentClass();

//ParentClassを継承したChildClassをインスタンス化する。
$child = new ChildClass();
$child->ParentMethod();
?>


メソッドにabstract修飾子をつけると、そのメソッドはサブクラスで必ずオーバーライドしなければなりません。
abstractメソッドを定義しているクラスはabstract修飾子をつけなければなりません。
abstractメソッドはメソッド定義だけを宣言し、処理内容は定義しません。
abstractメソッドをオーバーライドした際のアクセス修飾子は、abstractメソッドで定義した修飾子より同じか緩くする必要があります。
たとえばprotectedで定義したabstractメソッドをオーバーライドするときは、protectedまたはpublicにします。
abstractメソッドをオーバーライドしたとき、引数はabstractメソッドと同じにするか、省略可能な引数を追加することができます。

コンストラクタもabstract修飾子をつけることができます。
PHP5.4以前ではコンストラクタの引数はオーバーライド元のメソッドと違ってもよかったようですが、PHP5.4以降からは引数は同じか、省略可能な引数を追加することができます。
<?php
//親クラス(抽象クラス)
//abstractメソッドを定義しているクラスはabstract修飾子をつける
abstract class ParentClass {
    
    //abstractメソッドはメソッド定義だけを宣言し、処理内容は定義しません。
    protected abstract function AbstractMethod($value);
    
    //コンストラクタもabstractメソッドにすることができます。
    protected abstract function __construct();
}
//子クラス
class ChildClass extends ParentClass {
    //abstractメソッドをオーバーライド
    //アクセス修飾子は、abstractメソッドで定義した修飾子より同じか緩くする
    //引数はabstractメソッドと同じにするか、省略可能な引数を追加することができます
    public function AbstractMethod($value, $str='') {
    }
    
    //コンストラクタをオーバーライド
    //引数はabstractメソッドと同じにするか、省略可能な引数を追加することができます
    public function __construct($str=''){
    }
}
?>

0 件のコメント: