TOP書籍連動> インターフェイス
まるごと PHP!
まるごと PHP!

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

著者:桝形誠二(MASUGATA, Seiji)   2005/2/23
前のページ   1   2
インターフェイス

   インターフェイスは、実装はなく宣言だけが集まったもので、抽象クラス、抽象メソッドと似ています。その振る舞いも似ていますが、(強引に言ってしまうと)多重継承できることがインターフェイスの特徴です。

   インターフェイスを拡張したい場合には、「extends」を使います。複数のインターフェイスを継承(多重継承)したい場合には、「extends」の後に継承したいインターフェイス名を「,」で複数つなげて定義します。インターフェイスをクラスに実装するには「implements」を使います(リスト8)。

リスト8:interface.php
<?
interface MainInterface
{
function getMessage1( );
}

interface SubInterface
{
function getMessage2( );
}

interface ChildInterface extends MainInterface, SubInterface
{
function getMessage3( );
function getMessage4( );
}

interface moreInterface
{
function getMessage5( );
}

class ImplementsClass implements ChildInterface, moreInterface
{
function getMessage1( )
{
return "Define MainInterface!!\n";
}

function getMessage2( )
{
return "Define SubInterface!!\n";
}

function getMessage3( )
{
return "Define ChildInterface!!\n";
}

function getMessage4( )
{
return "Define ChildInterface!!\n";
}

function getMessage5( )
{
return "Define moreInterface!!\n";
}
}

$ImplementsClass = new ImplementsClass( );
echo $ImplementsClass->getMessage1( );
echo $ImplementsClass->getMessage2( );
echo $ImplementsClass->getMessage3( );
echo $ImplementsClass->getMessage4( );
echo $ImplementsClass->getMessage5( );

?>

   インターフェイスに定義されているメソッドをすべて実装しないと、「Fatal error: Class ***** contains 1 abstract methods and must therefore be declared abstract (*****::****)」のようなエラーが出力されます。

instanceof演算子、クラスタイプヒント

   instanceof演算子を使うと、オブジェクトが特定のクラスやインターフェイスなどに所属しているかどうかを判別できます。

   また、メソッドに渡されるオブジェクトのクラス名を指定するためのクラスタイプヒントが導入されました。クラスタイプヒントは、クラス、オブジェクトに対してのみ効果があり、通常の型に対しては効果がありません(リスト9)。

リスト9:class_type.php
<?
interface MainClassType
{
function checkType1( MainClassType $MainClassType );
}

interface SubClassType
{
function checkType2( SubClassType $SubClassType );
}

class ClassType implements MainClassType, SubClassType
{
function checkType1( MainClassType $MainClassType )
{
}

function checkType2( SubClassType $SubClassType )
{
}
}

class ngClass
{
}

$ClassType = new ClassType( );
$ngClass = new ngClass( );

if( $ClassType instanceof MainClassType ) { echo "OK!!\n"; }
if( $ClassType instanceof SubClassType ) { echo "OK!!\n"; }
if( !( $ngClass instanceof SubClassType ) ){ echo "NG!!\n"; }

$ClassType->checkType1( $ClassType );
$ClassType->checkType2( $ngClass );

?>

   クラスタイプヒントとして与えられた型以外を渡した場合には、「Fatal error: Argument * must implement interface ****」のようなエラーが出力されます。

前のページ   1   2



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


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