PHP 7 интерфейсы и абстрактные классы, как работает

В этой части учебника рассказывается как работают в PHP интерфейсы и абстрактные классы, это не сильно важная тема, но всё же её знать надо.

Абстрактные классы:

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

// Создаём абстрактный класс DefaultUser

abstract class DefaultUser {

 

    public $name; // Имя

    public $surname; // Фамилия

    public $status; // Статус

 

    // Обычный метод для вывода имени

    public function show_name () {

        echo «Имя: » . $this -> name . «</br>»;

        echo «Фамилия: » . $this -> surname . «</br>»;

        echo «Статус: » . $this -> status . «</br>»;

    }

 

    // Абстрактный метод для вывода класса

    abstract public function show_class ();

 

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

// Создаём наследуемый класс User

class User extends DefaultUser {

 

    // Конструктор класса

    public function __construct ($name, $surname) {

        $this -> name = $name;

        $this -> surname = $surname;

        $this -> status = «Обычный человек»;

    }  

 

    // Метод для вывода имени

    public function show_name () {

        parent::show_name();

    }

 

    // Абстрактный метод, абстрактного класса

    public function show_class () {

        echo «Это класс обычного пользователя</br>»;

    }

}

 

// Создаём наследуемый класс Admin

class Admin extends DefaultUser {

 

    // Конструктор класса

    public function __construct ($name, $surname) {

        $this -> name = $name;

        $this -> surname = $surname;

        $this -> status = «Админ»;

    }  

 

    // Метод для вывода имени

    public function show_name () {

        parent::show_name();

    }

 

    // Абстрактный метод, абстрактного класса

    public function show_class () {

        echo «Это класс админа</br>»;

    }

}

Как видите, обычный метод show_name(), который не абстрактный, он объявляется точно также, как если мы его наследовали с не абстрактного класса, а вот абстрактный метод, мы объявляем как будто его и нет, просто делаем метод с нуля.

// Создаём объект класса User

$User = new User(«Вова», «Пупкин»);

// Создаём объект класса Admin

$Admin = new Admin(«Вася», «Пупкин»);

 

$User -> show_class();

$Admin -> show_class();

Вот результат работы с абстрактным классов.

Вывод работы с абстрактным классом в PHPВывод работы с абстрактным классом в PHP

Как видите, мы вывели к какому классу принадлежит метод.

Интерфейсы:

Это один из элементов в ООП программирование, в том дела, что в PHP нет множественного наследования, и интерфейсы должны решить эту проблему.

// Создаём интерфейс UserShowName

interface UserShowName {

 

    // Обычный метод для вывода имени

    public function show_name ();

 

}

 

// Создаём интерфейс UserShowClass

interface UserShowClass {

 

    // Вывод принадлежности объекта

    public function show_class ();

 

}

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

Теперь покажу как их наследовать.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// Создаём класс User и наследуем его от интерфейсов

class User implements UserShowName, UserShowClass {

 

    public $name; // Имя

    public $surname; // Фамилия

    public $status; // Статус

 

    // Конструктор класса

    public function __construct ($name, $surname) {

        $this -> name = $name;

        $this -> surname = $surname;

        $this -> status = «Обычный человек»;

    }  

 

    // Метод для вывода имени

    public function show_name () {

        echo «Имя: » . $this -> name . «</br>»;

        echo «Фамилия: » . $this -> surname . «</br>»;

        echo «Статус: » . $this -> status . «</br>»;

    }

 

    // Вывод принадлежности объекта к класса

    public function show_class () {

        echo «Это класс обычного пользователя</br>»;

    }

}

Для наследования интерфейса используется слово implements, их можно наследовать сколько угодно, хоть десять.

Важно:

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

Вот результат программы.

Вывод программы интерфейса в PHPВывод программы интерфейса в PHP

Всё хорошо работает.

Вывод:

В этой части учебник было показано, что такое в PHP 7 интерфейсы и абстрактные классы, как с ними работать.

Часть получилась не очень большая, так как, эта тема достаточна простая и рассказывать про неё практически нечего.

Подписываетесь на соц-сети:

Оценка:

(Пока оценок нет)

Вывод программы интерфейса в PHPВывод программы интерфейса в PHP Загрузка…

Дополнительно:

Зачем нужны абстрактные классы и интерфейсы в php? — Хабр Q&A
Работая с ООП нужно четко вбить в себе в голову, что перед тобой не классы, а объекты. И разрабатывать архитектуру приложения нужно тоже с упором на это понятие.
Интерфейсы очень просто понять, для этого можно представить себе какой-то предмет с привычным для тебя названием «интерфейс». Это может быть:
  • пульт от телевизора с кнопками
  • сенсорная панель управления микроволновкой
  • приборная панель автомобиля
  • оболочка смартфона (Android, iOS, EMUI, MIUI и т.д.)
  • и пр.

Всё вышеописанное — это интерфейсы взаимодействия с внутренними механизмами приборов. Интерфейсы вносят некую абстракцию. Ты не знаешь, как работает прибор внутри. У тебя может быть один интерфейс, но реализация внутреннего функционала совершенно разная. То есть, например, у тебя есть тумблер на приборной панели автомобиля, который регулирует температуру кондиционера. Но ты не знаешь, что происходит внутри, когда ты его крутишь.
Перенесемся в программирование. Этот самый тумблер — это элемент интерфейса, он запускает публичный метод
setTemperature
. Это всё, что тебе нужно о нём знать.
То есть, резюмируя, интерфейсы — это декларированный абстрактный слой приложения с доступным ограниченным набором публичных методов взаимодействия с этим приложением. Твоё приложение может и будет содержать приватные методы, ибо если используешь ООП, инкапсуляция должна быть обязательно, чтобы скрыть в чёрный ящик ненужные для пользователя механизмы. Пользователю важно понимать, что покрутив тумблер, будет изменена температура — и всё. А уж как она будет изменена — это на суд программиста.

Абстрактный класс — это по сути тот же интерфейс, но только в нём можно заранее предопределить какие-то методы, и использовать их в наследуемом классе. Абстрактные методы же нужны для того, чтобы обязательно они были реализованы в классе наследнике, ибо без них класс наследник полноценно работать не будет.

Например, есть абстрактный класс, который работает с выборкой и перегоном данных из одной БД в другую. И все методы в нём уже реализованы, кроме одного абстрактного — getQuery, — метод, который возвращает строку с SQL запросом. Ведь запрос может быть разным и ты никогда не знаешь, какие в нем будут условия. Это какой-то абстрактный запрос, который неизвестен. И как раз под это действие очень удобно завести абстрактный метод.

Что такое абстрактный класс (abstract php) в языке PHP

Абстрактный класс в PHP (abstract class …) — обширный класс описывающий область дочерних классов. К примеру мы можем говорить о животных, машинах, окнах или о любых других областях. Поэтому существуют абстрактные классы которые позволяют описать методы, свойства объекта для последующего наследования.

Для примера возьмём машины:

abstract class Car {
     public $name;
}

Здесь мы просто создали абстрактный класс. Для того чтобы он имел смысл, надо создать дочерние классы:

class Bigfoot extends Car {
    public function getName() {
        return $this->name;
    }
}

Класс Bigfoot наследовал абстрактный класс Car, и имеет метод getName().  Конечно же лучше getName() делать в абстрактном классе Car, так как любая машина будет иметь название, так как присутствует в абстрактном классе свойство $name .

Также можно указать обязательные для объявления методы в самом абстрактном классе Car.

abstract class Car {
     public string $name = '';
     abstract public function MyFunc():string; # Это обязательный
     public function getName():string { # Вставили чтобы быть правильным
         return $this->name;
     
Статические классы в PHP через абстрактное ключевое слово?

цель абстрактного класса-определить методы, которые 1) значимы для других классов и 2) не значимы, когда не в контексте одного из этих классов.

для парафазных некоторые из РНР документы, представьте, что вы подключаетесь к базе данных. Подключение к базе данных не имеет большого смысла, если у вас нет определенного типа базы данных для подключения. Но подключение то, что вы хотите сделать независимо от типа базы данных. Поэтому подключение может быть определенный в абстрактном классе базы данных и унаследованный, и сделанный значимым, скажем, классом MYSQL.

из ваших требований похоже, что вы не собираетесь этого делать, а вместо этого просто требуете класс без экземпляра. Хотя вы можете использовать абстрактный класс для обеспечения этого поведения, это кажется мне избитым, потому что он злоупотребляет целью абстрактных классов. Если я столкнусь с абстрактным классом, я должен быть в состоянии разумно ожидать, что это будет иметь некоторые абстрактные методы, для пример, но ваш класс не будет иметь ни одного.

поэтому синглтон кажется лучшим вариантом.

однако, если причина, по которой вы хотите иметь класс без экземпляра, просто такова, что вы можете вызвать его где угодно, тогда почему у вас вообще есть класс? Почему бы просто не загрузить каждую переменную как глобальную, а затем вы можете просто вызвать его напрямую, а не через класс?

Я думаю, что лучший способ сделать это, чтобы создать экземпляр класса, а затем передать его вокруг инъекция зависимости. Если вы слишком ленивы, чтобы сделать это (и достаточно справедливо, если вы находитесь! Это твой код, не мой. тогда не беспокойтесь о классе вообще.

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

правильный способ здесь определенно не использовать одноэлементный или абстрактный класс и вместо этого использовать инъекцию зависимостей. Быстрый способ — иметь тонну глобалов или абстрактный класс.