使用介面(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 #4 使用介面常量
interface a{ const b = 1;}//輸出介面常量echo a::b;//錯誤寫法class b implements a{ const b = 1;}
介面加上類型約束,提供了一種很好的方式來確保某個對象包含有某些方法。參見 instanceof 操作符和類型約束。