Абстрактные классы в PHP

Изучаем абстрактные классы в PHP

Представьте, как было бы круто, если бы в интерфейсе можно было бы не только объявить методы, которые нужно реализовать, но и добавить некоторую реализацию. Например, определить какой-нибудь метод, у которого будет какая-то логика. Для этого в PHP есть абстрактные классы.

Выглядит определение абстрактного класса следующим образом:

Код доступен только после покупки курса ООП в PHP7.

Давайте попробуем создать объект этого класса:

Код доступен только после покупки курса ООП в PHP7.

Мы получим ошибку.
ошибка при создании объекта абстрактного класса

Создать объект абстрактного класса нельзя – от него можно только наследоваться. Примерно как с интерфейсами – их мы можем только реализовывать в других классах.

Такой класс может содержать абстрактные методы. По сути, это лишь объявление методов, которые должны быть реализованы в дочерних классах. Типа такого:

Код доступен только после покупки курса ООП в PHP7.

Но он также может содержать и обычные методы, которые будут содержать вполне себе реальную бизнес-логику. Пример:

Код доступен только после покупки курса ООП в PHP7.

То есть в классах-наследниках будет доступен уже реализованный метод printValue(), который без проблем можно переопределить. Он вызывает метод getValue(), который в самом классе пока не реализован, но мы можем его использовать в других методах.

Дочерние классы будут обязаны реализовать метод getValue(). Давайте опишем класс-наследник от этого абстрактного класса.

Код доступен только после покупки курса ООП в PHP7.

Такой код вызовет ошибку – класс ClassA не реализовал в себе метод getValue().

Ошибка из-за нереализованности абстрактного метода

Давайте это исправим.

Код доступен только после покупки курса ООП в PHP7.

Этот код вполне нормально отработает, и выведет на экран “kek”.

Читайте также
Комментарии


Galay
Galay
abstract class HumanAbstract
{
    private $name;
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    public function getName(): string
    {
        return $this->name;
    }
    abstract public function getGreetings(): string;
    abstract public function getMyNameIs(): string;

    public function introduceYourself(): string
    {
        return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
    }
}

class RussianHuman extends HumanAbstract
{

     public function getGreetings(): string
     {
        return  'Привет';
     }
     public function getMyNameIs(): string
     {
        return    'Меня зовут';
     }
}
class EnglishHuman extends HumanAbstract
{
     public function getGreetings(): string
     {
        return  'Hi';
     }
     public function getMyNameIs(): string
     {
        return  'My name is';
     }
}

$russian = new RussianHuman('Иван');

$english = new EnglishHuman('John');

echo $russian->introduceYourself();
echo '<br>';
echo $english->introduceYourself();

echo '<br>';
echo '<hr>';

Разобрался

ivashkevich
ivashkevich

Всё так, методы возвращают строки, нужно их просто вывести:

echo $russian->introduceYourself();
echo $english->introduceYourself();

А так - всё отлично!

Galay
Galay

Да, спасибо, разобрался.

g--nokoder
g--nokoder
<?php

    abstract class HumanAbstract{

        protected $name;

        public function __construct($name){
            $this->name = $name;
        }
        public function getName(){
            return $this->name;
        }

        abstract public function getGreetings();
        abstract public function getMyNameIs();

        public function introduceYourself(){
            return $this->getGreetings()." ! ".$this->getMyNameIs()." ".$this->getName()." .";
        }
    }

    class RussianHuman extends HumanAbstract{
        public function getGreetings(){
            return "Привет";
        }
        public function getMyNameIs(){
            return "Меня зовут ";
        }
    }

    class EnglishHuman extends HumanAbstract{
        public function getGreetings(){
            return "Hello ";
        }
        public function getMyNameIs(){
            return "My name is ";
        }
    }

    $russian = new RussianHuman("Амир");
    $english = new EnglishHuman("Amir");

    echo $russian->introduceYourself()."<br>";
    echo $english->introduceYourself()."<br>";
computerix
computerix
<?
abstract class HumanAbstract
{
    private $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }

    abstract public function getGreetings(): string;
    abstract public function getMyNameIs(): string;

    public function introduceYourself(): string
    {
        return $this->getGreetings() . '! ' . $this->getMyNameIs() . ' ' . $this->getName() . '.';
    }
}
class RussianHuman extends HumanAbstract
{
    private $name;
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    public function getMyNameIs(): string
    {
         return 'Меня зовут';
    }
    public function getGreetings(): string
 {
     return 'Привет';
 }
}
class EnglishHuman extends HumanAbstract
{
    private $name;
    public function __construct(string $name)
    {
        $this->name = $name;
    }
    public function getMyNameIs(): string
    {
         return 'My name is';
    }
    public function getGreetings(): string  
 {
     return 'Hi';
 }  
}
$rus = new RussianHuman('Иван');
$rus->introduceYourself();
$en = new EnglishHuman('Bob');
$en->introduceYourself();
?>
ivashkevich
ivashkevich

Всё ок, только стоит echo добавить перед $rus->introduceYourself();