Интерфейсите позволяват да се дефинират методите, които даден клас задължително трябва да реализира, без да се декларират самите тела на тези методи.
Интерфейсите се дефинират чрез ключовата дума interface, аналогично на обикновения клас, но без да се декларират телата на методите му.
Всички методи, дефинирани в даден интерфейс, трябва да бъдат public, поради спецификата на интерфейса.
За да се укаже, че даден клас реализира определен интерфейс, се използва операторът implements. Всички методи на интерфейса трябва да бъдат реализирани в класа. Нереализирането на метод предизвиква Фатална грешка. Даден клас може да реализира и повече от един интерфейс, като имената на интерфейсите в този случай се разделят със запетая.
Забележка: Даден клас не може да реализира два интерфейса, ако те имат методи с еднакви имена, тъй като това води до неопределеност.
Забележка: Интерфейсите могат да бъдат разширявани, също какт класовете, посредством оператора extend
Интерфейсите могат да имат константи. Интерфейсните константи работят точно както класовите константи. Те не могат да бъдат предефинирани от класа/интерфейса, който ги наследява.
Example #1 Пример за interface
<?php
// Декларация на интерфейс '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 Разширяеми интерфейси
<?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)
{
}
}
?>
Example #3 Множествено наследяване на интерфейси
<?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()
{
}
}
?>
Example #4 Интерфейси с константи
<?php
interface a
{
const b = 'Интерфейсна константа';
}
// Извежда: Интерфейсна константа
echo a::b;
// Това разбира се няма да работи, тъй като не е позволено
// предефинирането на константи. Концепцията е същата като
// при класовите константи
class b implements a
{
const b = 'Класова константа';
}
?>
Вж. също оператора instanceof.