使用接口(interface),你能夠指定某個類必須實現哪些方法,但不須要定義這些方法的具體內容。 php
咱們能夠經過interface來定義一個接口,就像定義一個標準的類同樣,但其中定義全部的方法都是空的。 this
接口中定義的全部方法都必須是public,這是接口的特性。 繼承
要實現一個接口,能夠使用implements操做符。類中必須實現接口中定義的全部方法,不然 會報一個fatal錯誤。若是要實現多個接口,能夠用逗號來分隔多個接口的名稱。 接口
Note: get
實現多個接口時,接口中的方法不能有重名。 io
Note: function
接口也能夠繼承,經過使用extends操做符。 class
接口中也能夠定義常量。接口常量和類常量的使用徹底相同。 它們都是定值,不能被子類或子接口修改。 foreach
Example #1 接口代碼示例 方法
// 聲明一個'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;
}
}
?>
Example #2 Extendable Interfaces
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)
{
}
}
?>
Example #3 多個接口間的繼承
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 使用接口常量
// 輸出接口常量
echo a::b;
// 錯誤寫法,由於常量的值不能被修改。接口常量的概念和類常量是同樣的。 class b implements a { const b = 'Class constant'; } ?>