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で実装しようとしすぎて周囲の反感を買いやすいのが最近の悩み。


この記事の評価をお聞かせください
ボタンをクリックしますとウインドウが開きます。
ご意見、ご要望にお応えします! インプレスIT INSIDE

INDEX
Part1:PHP5のオブジェクト指向(2)
final修飾子
 インターフェイス
まるごと PHP!
Part1 PHP5のオブジェクト指向(1)
PHP5のオブジェクト指向(2)
PHP5のオブジェクト指向(3)
Part2 トライ!SQLite(1)
トライ!SQLite(2)
トライ!SQLite(3)
Part3 MySQL拡張サポート(1)
MySQL拡張サポート(2)
MySQL拡張サポート(3)
Part4 PDO(PHP Data Object)データベース抽象化レイヤクラス(1)
PDO(PHP Data Object)データベース抽象化レイヤクラス(2)
PDO(PHP Data Object)データベース抽象化レイヤクラス(3)
Part5 PHP5のXMLサポート(1)
PHP5のXMLサポート(2)
PHP5のXMLサポート(3)
Part6 PHP4からPHP5への移行のポイント

Think IT 過去人気記事

注目おすすめ情報

Think IT人気ライター BEST 5

IT製品/サービス資料ダウンロード
    おすすめのホワイトペーパー情報を準備中です