Наша группа в телеграмм для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Интерфейсы объектов

Интерфейсы объектов позволяют создавать код, который указывает, какие методы и свойства должен включать класс, без необходимости описывания их функционала.

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

Все методы, определенные в интерфейсы должны быть публичными, что следует из самой природы интерфейса.

implements

Для реализации интерфейса используется оператор implements. Класс должен реализовать все методы, описанные в интерфейсе; иначе произойдет фатальная ошибка. При желании классы могут реализовывать более одного интерфейса за раз, реализуемые интерфейсы должны разделяться запятой.

Замечание:

Класс не может реализовать два интерфейса, содержащих одноименную функцию, так как это повлечет за собой неоднозначность.

Замечание:

Интерфейсы могут быть унаследованы друг от друга, так же как и классы, с помощью оператора extends.

Замечание:

Сигнатуры методов в классе, реализующем интерфейс, должны точно совпадать с сигнатурами, используемыми в интерфейсе, в противном случае будет вызвана фатальная ошибка.


Константы (Constants)

Интерфейсы могут содержать константы. Константы интерфейсов работают точно так же, как и константы классов, за исключением того, что они не могут быть перекрыты наследующим классом или интерфейсом.


Примеры

Пример #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)
// (Фатальная ошибка: Класс BadTemplate содержит 1 абстрактный метод
// и поэтому должнен быть объявлен абстрактным (iTemplate::getHtml))
class BadTemplate implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
}

Пример #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)
    {
    }
}

Пример #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()
    {
    }
}

Пример #4 Интерфейсы с константами

interface a
{
    const b = 'Константа интерфейса';
}
// Выведет: Константа интерфейса
echo a::b;
// Вот это, однако, не будет работать, так как  
// константы перекрывать нельзя.
class b implements a
{
    const b = 'Class constant';
}

Интерфейс, совместно с контролем типов, предоставляет отличный способ проверки того, что определенный объект содержит определенный набор методов. Смотрите также оператор instanceof и контроль типов.


Описание на ru2.php.net
Описание на php.ru

.

Популярное:


Содержание: