オブジェクト インターフェイス
オブジェクトインターフェイスにより、あるクラスが実装する必要があるメソッドの 種類を、これらのメソッドの実装を定義することなく、指定するコードを作成できる ようになります。
インターフェイスは通常のクラスと同様に定義することができますが、
キーワード class
のかわりに interface
を用います。またメソッドの実装は全く定義されません。
インターフェイス内で宣言される全てのメソッドはpublicである必要があります。 これは、インターフェイスの特性によります。
コンストラクタ をインターフェイスで宣言できることに注意して下さい。 これはたとえばファクトリで使う場合など、コンテクストによっては役に立ちます。
implements
インターフェイスを実装するには、implements
演算子を使用し、
このインターフェイスに含まれる全てのメソッドを実装する必要があります。
実装されていない場合、致命的エラーとなります。
各インターフェイスをカンマで区切って指定することで、
クラスは複数のインターフェイスを実装することができます。
注意:
PHP 5.3.9 より前のバージョンでは、ひとつのクラスの中で同じ名前のメソッドを定義した2つのインターフェイスを実装することはできませんでした。曖昧さを解決できなくなるためです。 PHP 5.3.9 以後のバージョンでは、同じ名前のメソッドが同じシグナチャを持っている場合に限り、こうした実装を行えるようになっています。
注意:
クラスと同様、インターフェイスも extends 演算子で継承することができます。
注意:
インターフェイスを実装したクラスには、 そのインターフェイスで定義されているメソッドと、リスコフの置換原則(LSP)と互換性が取れたメソッドシグナチャを使う必要があります。 そうしなければ致命的なエラーが発生します。
定数
インターフェイスに定数を持たせることもできます。 インターフェイス定数は クラス定数 とまったく同じように動作します。しかし、 そのインターフェイスを継承したクラスやインターフェイスから上書きすることはできません。
例
例1 Interface の例
<?php// インターフェイス 'iTemplate' を宣言するinterface iTemplate{ public function setVariable($name, $var); public function getHtml($template);}// インターフェイスを実装する。// これは動作します。class Template implements iTemplate{ private $vars = array(); public function setVariable($name, $var) { $this->vars[$name] = $var; } public function getHtml($template) { foreach($this->vars as $name => $value) { $template = str_replace('{' . $name . '}', $value, $template); } return $template; }}// これは動作しません。// Fatal error: Class BadTemplate contains 1 abstract methods// and must therefore be declared abstract (iTemplate::getHtml)class BadTemplate implements iTemplate{ private $vars = array(); public function setVariable($name, $var) { $this->vars[$name] = $var; }}?>
例2 インターフェイスの継承
<?phpinterface a{ public function foo();}interface b extends a{ public function baz(Baz $baz);}// これは動作しますclass c implements b{ public function foo() { } public function baz(Baz $baz) { }}// これは動作せず、fatal error となりますclass d implements b{ public function foo() { } public function baz(Foo $foo) { }}?>
例3 複数のインターフェイスの継承
<?phpinterface a{ public function foo();}interface b{ public function bar();}interface c extends a, b{ public function baz();}class d implements c{ public function foo() { } public function bar() { } public function baz() { }}?>
例4 インターフェイスでの定数
<?phpinterface a{ const b = 'Interface constant';}// Interface constant と表示しますecho a::b;// しかし、これは動作しません。定数のオーバーライドが// できないからです。class b implements a{ const b = 'Class constant';}?>
インターフェイスとタイプヒンティングを組み合わせると、 特定のオブジェクトに特定のメソッドをうまく持たせることができます。 instanceof 演算子および 型宣言 を参照ください。