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 нет множественного наследования, и интерфейсы должны решить эту проблему.
// Создаём интерфейс 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 7 интерфейсы и абстрактные классы, как с ними работать.
Часть получилась не очень большая, так как, эта тема достаточна простая и рассказывать про неё практически нечего.
Подписываетесь на соц-сети:
Оценка:
(Пока оценок нет)
Загрузка…Дополнительно:
Интерфейсы очень просто понять, для этого можно представить себе какой-то предмет с привычным для тебя названием «интерфейс». Это может быть:
- пульт от телевизора с кнопками
- сенсорная панель управления микроволновкой
- приборная панель автомобиля
- оболочка смартфона (Android, iOS, EMUI, MIUI и т.д.)
- и пр.
Всё вышеописанное — это интерфейсы взаимодействия с внутренними механизмами приборов. Интерфейсы вносят некую абстракцию. Ты не знаешь, как работает прибор внутри. У тебя может быть один интерфейс, но реализация внутреннего функционала совершенно разная. То есть, например, у тебя есть тумблер на приборной панели автомобиля, который регулирует температуру кондиционера. Но ты не знаешь, что происходит внутри, когда ты его крутишь.
То есть, резюмируя, интерфейсы — это декларированный абстрактный слой приложения с доступным ограниченным набором публичных методов взаимодействия с этим приложением. Твоё приложение может и будет содержать приватные методы, ибо если используешь ООП, инкапсуляция должна быть обязательно, чтобы скрыть в чёрный ящик ненужные для пользователя механизмы. Пользователю важно понимать, что покрутив тумблер, будет изменена температура — и всё. А уж как она будет изменена — это на суд программиста.
Абстрактный класс — это по сути тот же интерфейс, но только в нём можно заранее предопределить какие-то методы, и использовать их в наследуемом классе. Абстрактные методы же нужны для того, чтобы обязательно они были реализованы в классе наследнике, ибо без них класс наследник полноценно работать не будет.
Что такое абстрактный класс (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;
цель абстрактного класса-определить методы, которые 1) значимы для других классов и 2) не значимы, когда не в контексте одного из этих классов.
для парафазных некоторые из РНР документы, представьте, что вы подключаетесь к базе данных. Подключение к базе данных не имеет большого смысла, если у вас нет определенного типа базы данных для подключения. Но подключение то, что вы хотите сделать независимо от типа базы данных. Поэтому подключение может быть определенный в абстрактном классе базы данных и унаследованный, и сделанный значимым, скажем, классом MYSQL.
из ваших требований похоже, что вы не собираетесь этого делать, а вместо этого просто требуете класс без экземпляра. Хотя вы можете использовать абстрактный класс для обеспечения этого поведения, это кажется мне избитым, потому что он злоупотребляет целью абстрактных классов. Если я столкнусь с абстрактным классом, я должен быть в состоянии разумно ожидать, что это будет иметь некоторые абстрактные методы, для пример, но ваш класс не будет иметь ни одного.
поэтому синглтон кажется лучшим вариантом.
однако, если причина, по которой вы хотите иметь класс без экземпляра, просто такова, что вы можете вызвать его где угодно, тогда почему у вас вообще есть класс? Почему бы просто не загрузить каждую переменную как глобальную, а затем вы можете просто вызвать его напрямую, а не через класс?
Я думаю, что лучший способ сделать это, чтобы создать экземпляр класса, а затем передать его вокруг инъекция зависимости. Если вы слишком ленивы, чтобы сделать это (и достаточно справедливо, если вы находитесь! Это твой код, не мой. тогда не беспокойтесь о классе вообще.
обновление: похоже, что вы конфликтуете между двумя потребностями: необходимостью делать вещи быстро и необходимостью делать все правильно. Если вы не заботитесь о переносе тонны глобальных переменных ради экономии времени, вы, как предполагается, предпочтете использовать абстрактное над одноэлементным, потому что оно включает в себя меньше напечатать. Выберите, какая потребность для вас важнее, и придерживайтесь ее.
правильный способ здесь определенно не использовать одноэлементный или абстрактный класс и вместо этого использовать инъекцию зависимостей. Быстрый способ — иметь тонну глобалов или абстрактный класс.
0
автор: Rupert Madden-Abbott
PHP Abstract Class
Резюме : в этом руководстве вы узнаете об абстрактном классе PHP и абстрактном методе, а также узнаете, как использовать абстрактный класс для определения структуры для иерархии классов.
Введение в абстрактный метод и абстрактный класс
В иерархии наследования подклассы реализуют конкретные детали, тогда как родительский класс определяет структуру своих подклассов. Родительский класс также служит шаблоном для общих методов, которые будут реализованы его подклассами.Чтобы сделать родительские классы более общими и абстрактными, PHP предоставляет абстрактный метод и абстрактный класс.
Абстрактный метод — это метод, который не имеет реализации. Для создания абстрактного метода вы используете ключевое слово abstract
следующим образом:
abstract public function abstractMethod (); |
Абстрактный класс — это класс, который содержит хотя бы один абстрактный метод. Чтобы объявить абстрактный класс, вы также используете ключевое слово abstract
следующим образом:
Php abstract class abstractClass { abstract public function abstractMethod (); //., другие методы и свойства } |
Пример абстрактного класса PHP
Давайте рассмотрим пример, чтобы понять, как работают абстрактный класс и абстрактный метод. Мы разработаем новые классы на основе следующей диаграммы классов:
Пример абстрактного класса PHP
Php абстрактный класс Person { protected $ firstName; защищено $ lastName; открытая функция __construct ($ firstName, $ lastName) { $ this-> firstName = $ firstName; $ this-> lastName = $ lastName; } открытая функция __toString () { return sprintf («% s,% s», $ this-> lastName, $ this-> firstName); } abstract public function getSalary (); } |
$ p = new Person (‘John’, ‘Doe’); |
имя
и $ фамилия.
Абстрактный класс может содержать полностью реализованные методы, например, __toString ()
метод.
Абстрактный класс позволяет вам объявить класс с частичной реализацией.Подклассы обеспечат конкретную реализацию для абстрактных методов.
Классы, которые наследуют абстрактный класс, называются конкретными классами , например, класс Сотрудник
и класс Подрядчик
являются конкретными классами.
1 2 3 9 16 17 18 19 20 21 | Php require_once ‘классы / чел.PHP ‘; класс Сотрудник продлевает Лицо { частная $ зарплата; открытая функция __construct ($ firstName, $ lastName, $ salary) { parent :: __ construct ($ firstName, $ lastName); $ это-> зарплата = $ зарплата; } публичная функция getSalary () { return $ salary; } открытая функция __toString () { return sprintf («Имя:% s parent :: __ toString (), $ this-> зарплата); } } |
Ниже показано, как использовать Класс сотрудника
:
Php require_once ‘classes / employee.php’; $ e = new Employee (‘John’, ‘Doe’, 5000); echo $ e; |
Мы может разработать другой конкретный класс с именем Подрядчик
следующим образом:
1 2 3 4 5 6 7 8 9 10 10 12 13 14 15 16 17 18 19 20 21 22 23 24 | 000000 персидско п.PHP ‘; класс Подрядчик продлевает лицо { частный $ курс; частных $ billableHours; открытая функция __construct ($ firstName, $ lastName, $ rate, $ billableHours) { parent :: __ construct ($ firstName, $ lastName); $ this-> rate = $ rate; $ this-> billableHours = $ billableHours; } открытая функция getSalary () { return $ this-> rate * $ this-> billableHours; } открытая функция __toString () { return sprintf («Имя:% s parent :: __ toString (), $ this-> getSalary ()); } } |
И пример кода, который использует класс Подрядчик
:
Php require_once ‘classes / contractor.php’; $ c = новый подрядчик (‘David’, ‘Hill’, 75, 175); echo $ c; |
Файлы сценариев учебника по абстрактному классу PHP можно скачать по следующей ссылке:
Абстрактный класс PHP (1457 загрузок)Мы представили вам понятие абстрактного класса и абстрактного метода.Затем мы дали вам один пример того, как использовать абстрактный класс для компоновки структуры для иерархии классов.
- Был ли этот урок полезным?
- Да Нет
- Товары
- Случаи использования
- Переполнение стека Публичные вопросы и ответы
- Команды Частные вопросы и ответы для вашей команды
- предприятие Частные вопросы и ответы для вашего предприятия
- работы Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимать технический талант
- реклама Связаться с разработчиками по всему миру
- Товары
- Клиенты
- Случаи использования
- Переполнение стека Публичные вопросы и ответы
- Команды Частные вопросы и ответы для вашей команды
- предприятие Частные вопросы и ответы для вашего предприятия
- работы Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимать технический талант
- реклама Связаться с разработчиками по всему миру
- Товары
- Клиенты
- Случаи использования
- Переполнение стека Публичные вопросы и ответы
- Команды Частные вопросы и ответы для вашей команды
- предприятие Частные вопросы и ответы для вашего предприятия
- работы Программирование и связанные с ним технические возможности карьерного роста
- Талант Нанимать технический талант
- реклама Связаться с разработчиками по всему миру