クラスアブストラクション

PHP 5 では、抽象クラスとメソッドが導入されました。 abstractとして宣言されたクラスのインスタンスを生成することはできません。 1つ以上の抽象メソッドを含む全てのクラスもまた抽象クラスとなります。 abstractとして定義されたメソッドは、そのメソッドの外観を宣言するのみで、 実装を定義することはできません。

抽象クラスから継承する際、親クラスの宣言で abstract としてマークされた 全てのメソッドは、子クラスで定義されなければなりません。加えて、 これらのメソッドは同等以下の 可視性 で 定義される必要があります。例えば、抽象メソッドが protected として定義された場合、その関数の実装は protected または public のどちらかとして定義する必要があります。

例 19-18. 抽象クラスの例

<?php
abstract
class AbstractClass
{
    
// 拡張クラスにこのメソッドの定義を強制する
    
abstract protected function getValue ();
    
abstract protected function prefixValue ( $prefix );

    
// Common method
    
public function printOut () {
        print
$this -> getValue () . "\n" ;
    }
}

class
ConcreteClass1 extends AbstractClass
{
    
protected function getValue () {
        return
"ConcreteClass1" ;
    }

    
public function prefixValue ( $prefix ) {
        return
" { $prefix } ConcreteClass1" ;
    }
}

class
ConcreteClass2 extends AbstractClass
{
    
public function getValue () {
        return
"ConcreteClass2" ;
    }

    
public function prefixValue ( $prefix ) {
        return
" { $prefix } ConcreteClass2" ;
    }
}

$class1 = new ConcreteClass1 ;
$class1 -> printOut ();
echo
$class1 -> prefixValue ( 'FOO_' ) . "\n" ;

$class2 = new ConcreteClass2 ;
$class2 -> printOut ();
echo
$class2 -> prefixValue ( 'FOO_' ) . "\n" ;
?>

上の例の出力は以下となります。

ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2

'abstract'という名前のユーザー定義関数または関数を有さない コードは修正なしに動作します。