Класове и обекти (PHP 5)
PHP Manual

Интерфейси

Интерфейсите позволяват да се дефинират методите, които даден клас задължително трябва да реализира, без да се декларират самите тела на тези методи.

Интерфейсите се дефинират чрез ключовата дума interface, аналогично на обикновения клас, но без да се декларират телата на методите му.

Всички методи, дефинирани в даден интерфейс, трябва да бъдат public, поради спецификата на интерфейса.

implements

За да се укаже, че даден клас реализира определен интерфейс, се използва операторът 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 
extends a
{
    public function 
baz(Baz $baz);
}

// Това ще работи
class implements b
{
    public function 
foo()
    {
    }

    public function 
baz(Baz $baz)
    {
    }
}

// Това няма да работи и ще предизвика Фатална грешка
class implements b
{
    public function 
foo()
    {
    }

    public function 
baz(Foo $foo)
    {
    }
}
?>

Example #3 Множествено наследяване на интерфейси

<?php
interface a
{
    public function 
foo();
}

interface 
b
{
    public function 
bar();
}

interface 
extends ab
{
    public function 
baz();
}

class 
implements c
{
    public function 
foo()
    {
    }

    public function 
bar()
    {
    }

    public function 
baz()
    {
    }
}
?>

Example #4 Интерфейси с константи

<?php
interface a
{
    const 
'Интерфейсна константа';
}

// Извежда: Интерфейсна константа
echo a::b;


// Това разбира се няма да работи, тъй като не е позволено
// предефинирането на константи. Концепцията е същата като 
// при класовите константи
class implements a
{
    const 
'Класова константа';
}
?>

Вж. също оператора instanceof.


Класове и обекти (PHP 5)
PHP Manual