Абстрактные классы и методы в PHP. В чем их отличие от интерфейсов?

абстрактные классы и методы в php. в чем их отличие от интерфейсов?

Что такое абстрактные классы?

Представьте, что у вас есть несколько классов со схожим поведением. У них есть идентичные реализации методов и свойств. Чтобы не раздувать программный код и избавиться от его повторяемости можно применить наследование классов.

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

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

Определение абстрактного класса

Создание абстрактного класса в PHP происходит аналогично обычному, с указанием ключевого слова abstract перед class. Выражение в общем виде можно записать как «abstract class ИмяАбстрактногоКласса {/* определение методов и свойств */}».

//Определение абстрактного класса "Электрический генератор"
abstract class ElectricityGenerator
{
    //свойство накопленной энергии
    protected $energyCount = 0;

    //метод генерации энергии
    function generateEnergy()
    {
        $this->energyCount += 10;
        echo "Сгенерировано {$this->energyCount}Кл энергии";
    }
}

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

Работа с абстрактными методами

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

Правило формирования абстрактного метода:

  • Он может иметь модификаторы доступа public или protected. Использование private запрещено.
  • Абстрактные методы не должны иметь реализации. В их определение входит только модификатор доступа, имя и список параметров. Сразу за круглыми скобками параметров находится точка с запятой.
  • В самом начале определения метода, перед модификатором доступа должно находиться ключевое слово abstract.

Нарушение любого из правил, приведенных выше, вызовет фатальную ошибку и прекращение выполнения программы.

//Абстрактный класс "Банкомат"
abstract class CashMachine
{
    //Абстрактный метод входа в систему
    abstract public function login($pinCode);

    //Обычный метод успешного входа
    public function greeting()
    {
        echo 'Вы успешно вошли в систему!';
    }
}

Наследование абстрактного класса

Операция наследования абстрактного класса полностью аналогична обычному. Для этого нужно использовать оператор extends. Заметим, что дочерний класс должен определять реализации всех абстрактных методов, существующих в родителе. Их модификаторы доступа, имена и списки параметров должны совпадать полностью, иначе программный код завершится с ошибкой.

//Наследование абстрактного класса из
//прошлого примера.
class ShopTerminal extends CashMachine
{
    //Реализация абстрактного метода
    public function login($pinCode)
    {
        if ($pinCode === 1111) {
        $this->greeting();

        } else {
           echo 'Введен неправильный PIN!';
        }
    }
}

//Создаем экземпляр магазинного терминала
$shopTerminal = new ShopTerminal();
$shopTerminal->login(1111);
/*
* Результат:
* Вы успешно вошли в систему!
*/

$shopTerminal->login(4567);
/*
* Результат:
* Введен неправильный PIN!
*/

Последние публикации