インターフェースを使用すると、特定のクラスが実装する必要があるメソッドを指定できますが、これらのメソッドの特定の内容を定義する必要はありません。
インターフェースは、標準クラスを定義するのと同じように、interface キーワードを通じて定義されますが、その中で定義されているメソッドはすべて空です。
インターフェースで定義されるすべてのメソッドはパブリックである必要があります。これはインターフェースの特性です。
実装
インターフェイスを実装するには、implements 演算子を使用します。クラスは、インターフェイスで定義されたすべてのメソッドを実装する必要があります。実装しない場合は、致命的なエラーが報告されます。クラスは複数のインターフェイスを実装できます。複数のインターフェイスの名前を区切るにはカンマを使用します。
注:
複数のインターフェースを実装する場合、インターフェース内のメソッドに同じ名前を付けることはできません。
注:
extends 演算子を使用してインターフェイスを継承することもできます。
注:
インターフェイスを実装するには、クラスはインターフェイスで定義されたメソッドをまったく同じ方法で使用する必要があります。そうしないと、致命的なエラーが発生します。
定数
定数はインターフェースでも定義できます。インターフェイス定数はクラス定数とまったく同じように使用されますが、サブクラスまたはサブインターフェイスによってオーバーライドすることはできません。
例
例 #1 インターフェースの例
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; } } //下面的写法是错误的,会报错,因为没有实现getHtml() class BadTemplate implements ITemplate { private $vars = array(); public function setVariable($name,$var) { $this->vars[$name] = $var; } }
例 #2 拡張可能なインターフェース
interface 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){} } //错误写法 class d implements b { public function foo(){} public function baz(Foo $foo){} }
例 #3 複数のインターフェースを継承する
interface 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 インターフェース定数を使用する
interface a { const b = 1; } //输出接口常量 echo a::b; //错误写法 class b implements a { const b = 1; }
インターフェースと型制約が提供することを保証する良い方法オブジェクトには特定のメソッドが含まれています。 「instanceof 演算子と型の制約」を参照してください。