使用接口(interface),可以指定某個類必須實現(xiàn)哪些方法,但不需要定義這些方法的具體內容。
接口是通過 interface 關鍵字來定義的,就像定義一個標準的類一樣,但其中定義所有的方法都是空的。
接口中定義的所有方法都必須是公有,這是接口的特性。
要實現(xiàn)一個接口,使用 implements 操作符。類中必須實現(xiàn)接口中定義的所有方法,否則會報一個致命錯誤。類可以實現(xiàn)多個接口,用逗號來分隔多個接口的名稱。
注意:
1、實現(xiàn)多個接口時,接口中的方法不能有重名。
2、接口也可以繼承,通過使用 [extends]操作符。
3、類要實現(xiàn)接口,必須使用和接口中所定義的方法完全一致的方式。否則會導致致命錯誤。
4、接口中也可以定義常量。接口常量和[類常量]的使用完全相同,但是不能被子類或子接口所覆蓋。
接口示例:
<?php
// 聲明一個'iTemplate'接口
interface iTemplate
{
public function setVariable($name, $var);
public function getHtml($template);
}
// 實現(xiàn)接口
// 下面的寫法是正確的
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;
}
}
// 下面的寫法是錯誤的,會報錯,因為沒有實現(xiàn) getHtml():
// 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;
}
}
?>
可擴充接口:
<?php
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)
{
}
}
?>
繼承多個接口:
<?php
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()
{
}
}
?>
使用接口常量:
<?php
interface a
{
const b = 'Interface constant';
}
// 輸出接口常量
echo a::b;
// 錯誤寫法,因為常量不能被覆蓋。接口常量的概念和類常量是一樣的。
class b implements a
{
const b = 'Class constant';
}
?>