Интерфейс и абстрактный класс

Интерфейс

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

Применить интерфейс к классу можно через ключевое слово implements.

interface BaseTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}
 
class Template implements BaseTemplate
{
    public function setVariable($name, $var) {
        // код
    }
 
    public function getHtml($template) {
        // код
    }
}

Если класс Template не содержал бы метод getHtml, то отобразилась бы ошибка «Fatal Error».

Для класса можно указывать несколько интерфейсов.

class Template implements BaseTemplate, SecondTemplate
{
    // код
}

Абстрактный класс

Указать обязательные методы можно также через абстрактный класс, который создаётся через ключевое слово abstract.

abstract class BaseTemplate
{
    abstract function setVariable($name, $var);
}

class Template extends BaseTemplate
{
    public function setVariable($name, $var)
    {
        // код
    }
}

Методы, определённые через ключевое слово abstract должны быть переопределены в дочернем классе, иначе выведется ошибка «Fatal error».

Если в классе есть абстрактный метод, то класс должен быть задан как абстрактный.

Нельзя создавать объект из абстрактного класса.

abstract class BaseTemplate
{
    abstract function setVariable($name, $var);
}

// При создание объекта из абстрактного класса будет происходить ошибка
$template = new BaseTemplate(); // Fatal Error

Одно из основных различий между интерфейсом и абстрактного класса в том, что класс может наследоваться только от одного абстрактного класса, а интерфейсов у него может быть несколько.