Чат PHP-разработчиков
Логические задачи с собеседований
Абстрактные классы в PHP

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Этот код вполне нормально отработает, и выведет на экран “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();

Benya
Benya
class UkraineHuman 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 ';
    }
}

$ukr = new UkraineHuman('Микола');
$eng = new EnglishHuman('Nikolay');

echo $ukr->introduceYourself();
echo $eng->introduceYourself();
ivashkevich
ivashkevich

А где метод introduceYourself?

DmitryGavrilov
DmitryGavrilov
<?php

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 RussianMan extends HumanAbstract
{

    public function getGreetings(): string
    {

        return 'Здравствуйте';

    }

    public function getMyNameIs(): string
    {

        return 'Имя моё - ';

    }

}

class EnglishMan extends HumanAbstract
{

    public function getGreetings(): string
    {

        return ' Hello my friend';

    }

    public function getMyNameIs(): string
    {

        return 'The name of mine is - ';

    }

}

$Russia = new russianMan('Петр Первый');
echo '<br>';
$England = new englishMan('Benedict Camberbatch, as you know');

echo $Russia->introduceYourself();
echo $England->introduceYourself();
SBTesla
SBTesla
<?php
abstract class HumanAbstract {
     private $name;
     public function __construct($name)
     {
          $this->name = $name;
     }
     public function getName()
     {
          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 ' Hello ';
     }

     public function getMyNameIS(): string
     {
          return 'My Name is';
     }
}

$rus = new RussianHuman('Вася');
$eng = new EnglishHuman('Greg');

echo $rus->introduceYourself();
echo '<br>';
echo $eng->introduceYourself();
ivashkevich
ivashkevich

Отлично!!!

ArtemijeKA
ArtemijeKA
class RussianHuman extends HumanAbstract {
    public function getGreetings(): string {
        return 'Привет';
    }

    public function getMyNameIs(): string {
        return 'Мое имя';
    }
}

class EnglishHuman extends HumanAbstract {
    public function getGreetings(): string {
        return 'Hello';
    }

    public function getMyNameIs(): string {
        return 'My name is';
    }
}

$nikolay = new RussianHuman('Коля');
$stepan = new RussianHuman('Степка');
echo $nikolay->introduceYourself() . '<br>'; // Привет! Мое имя Коля.
echo $stepan->introduceYourself() . '<br>'; // Привет! Мое имя Степка.
ivashkevich
ivashkevich

Супер гуд!

ArtemijeKA
ArtemijeKA

Спасибо!

Protos
Protos
class RuusianHuman extends HumanAbstract{

    public function getMyNameIs(): string
    {
        // TODO: Implement getMyNameIs() method.
        return 'Меня зовут ';
    }
    public function getGreetings(): string
    {
        // TODO: Implement getGreetings() method.
        return 'Привет';
    }
}

class EnglishHuman extends HumanAbstract{
    public function getMyNameIs(): string
    {
        // TODO: Implement getMyNameIs() method.
        return 'My nsme is';
    }
    public function getGreetings(): string
    {
        // TODO: Implement getGreetings() method.
        return 'Hello';
    }
}
$russian = new RuusianHuman('Иван');
echo $russian->introduceYourself();
$english = new EnglishHuman('John');
echo $english->introduceYourself();
ivashkevich
ivashkevich

Хорошо, но комментарии TODO нужно убрать. Они создаются для того, чтобы не забыть что-то сделать.

zebra
zebra

Домашка:)

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 'Меня зовут';
    }
}

$rusObj = new RussianHuman('Игорь');
echo $rusObj->introduceYourself();
echo '<br>';

class EnglishHuman extends HumanAbstract
{
    public function getGreetings(): string
    {
        return 'Hello';
    }

    public function getMyNameIs(): string 
    {
        return 'My name is';
    }
}

$engObj = new EnglishHuman('Mike');
echo $engObj->introduceYourself();
ivashkevich
ivashkevich

Отлично =)

Todd
Todd
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';
    }

}

$rus = new RussianHuman('Иван');
$eng = new EnglishHuman('Todd');

echo $rus->introduceYourself() . '<br>';
echo $eng->introduceYourself();
demyanovpaul@yandex.ru
demyanovpaul@yandex.ru

Отнаследуйте от него 2 класса: RussianHuman и EnglishHuman.
Реализуйте в них методы getGreetings(), которые будут возвращать приветствие на разных языках, вроде «Привет».
Реализуйте в них методы getMyNameIs(), которые будут возвращать на разных языках слова «Меня зовут».
В итоге метод introduceYourself должен возвращать строку, вроде «Привет! Меня зовут Иван.»
Создайте объекты этих классов и заставьте их поздороваться.

<?php
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 'Hello';
    }

    public function getMyNameIs(): string
    {
        return 'My name is';
    }
}

$russianPeople = new RussianHuman('Павел');
$englishPeople = new EnglishHuman('Alex');

echo $russianPeople->introduceYourself();
echo '<br>';
echo $englishPeople->introduceYourself();