使用介面(interface),可以指定某個類別必須實作哪些方法,但不需要定義這些方法的具體內容。
介面是透過 interface 關鍵字來定義的,就像定義一個標準的類別一樣,但其中定義所有的方法都是空的。
介面中定義的所有方法都必須是公有,這是介面的特性。
實作(implements)
要實作一個接口,使用 implements 操作子。類別中必須實作介面中定義的所有方法,否則會報一個致命錯誤。類別可以實作多個接口,用逗號來分隔多個接口的名稱。
Note:
實作多個介面時,介面中的方法不能有重名。
Note:
介面也可以繼承,透過使用 extends 運算子。
Note:
類別要實現接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤。
常數
介面中也可以定義常數。介面常數和類別常數的使用完全相同,但是不能被子類別或子介面所覆蓋。
範例
Example #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; } }
Example #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){} }
Example #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(){} }
Example #4448一個很好的方式來確保某個物件包含有某些方法。參見 instanceof 操作符和類型約束。