TOP書籍連動> final修飾子
まるごと PHP!
まるごと PHP!

Part1:PHP5のオブジェクト指向(2)

著者:桝形誠二(MASUGATA, Seiji)   2005/2/23
1   2  次のページ
final修飾子

   前回に引き続き、PHP5のオブジェクト指向の機能について解説します。まず、Privateなどと同じく新しく追加されたfinal修飾子を紹介します。

   final修飾子を付けてクラスやメソッドを宣言すると、クラスの継承やメソッドのオーバーライドを許可しないように制御できます(リスト6)。これにより、意図しない継承が行われて、不正な動作を引き起こすのを防ぐことができます。

リスト6:final.php
<?
final class FinalClass
{
function getPrint( )
{
echo $this->Foo;
echo $this->Bar;
}
}

/********************************************
class MyFinalClass extends FinalClass
{
}
********************************************/

class FinalMethod
{
function getPrint( )
{
echo $this->Foo;
echo $this->Bar;
}

final function setPrint( $Value1, $Value2 )
{
$this->Foo = $Value1;
$this->Bar = $Value2;
}
}

class MyFinalMethod extends FinalMethod
{
/********************************************
function setPrint( $Value1, $Value2 )
{
$this->Foo = $Value2;
$this->Bar = $Value1;
}
********************************************/
}
//$MyFinalClass = new MyFinalClass( );
$MyFinalMethod = new MyFinalMethod( );


?>

   クラスに対して「final」を定義すると、クラス全体を継承することが禁止されます。メソッドに対して「final」定義をすると、クラスの継承は許可しますが、「final」定義のあるメソッドのオーバーライドは禁止されます。禁止された継承、オーバーライドを行うと、次のようなエラーが出力されます。

  • Fatal error: Class ***** may not inherit from final class (FinalClass)
  • Fatal error: Cannot override final method *****::*****()

   メンバー変数には「final」の定義はできないので、Private/Protectedメンバー変数、メソッドと混同しないよう注意してください。

抽象クラス、メソッド

   PHP5では、抽象クラスと抽象メソッドを使って、メソッドの実装を強制することができます。

   抽象メソッドは、定義だけで実装が提供されないメソッドです。抽象メソッドを含むクラスは、抽象クラスとして宣言する必要があります。どちらも「abstract」を使って宣言します。抽象クラスを拡張したい場合には「extends」を使います(リスト7)。

リスト7:abstract.php
<?
abstract class AbstractClass
{
abstract function getMessage1( );
}

abstract class SubAbstractClass extends AbstractClass
{
abstract function getMessage2( );
abstract function getMessage3( );
}

class ImplementedClass extends SubAbstractClass
{
function getMessage1( )
{
return "Abstract Method!!\n";
}

function getMessage2( )
{
return "SubAbstract Method!!\n";
}

function getMessage3( )
{
return "SubAbstract Method!!\n";
}
}

$ImplementedClass = new ImplementedClass( );
echo $ImplementedClass->getMessage1( );
echo $ImplementedClass->getMessage2( );
echo $ImplementedClass->getMessage3( );

$AbstractClass = new AbstractClass( );

?>

   抽象クラスに定義されている抽象メソッドを実装しないと、「Fatal error: Cannot instantiate abstract class ****」のようなエラーが出力されます。また、抽象クラスのインスタンス生成はできません。

1   2  次のページ



著者プロフィール
桝形 誠二
様々な言語を経験していく中でPHPと出会い、初心者に易しいという魅力に惹かれ続けて早5年。色んな事をPHPで実装しようとしすぎて周囲の反感を買いやすいのが最近の悩み。


INDEX
Part1:PHP5のオブジェクト指向(2)
final修飾子
 インターフェイス