Для чего нужен абстрактный класс php

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

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

Для того, чтобы объявить класс абстрактным, нужно при его объявлении написать ключевое слово abstract :

Попытка создать объект класса User вызовет ошибку:

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

Давайте попробуем на практике. Пусть предполагается, что все потомки класса User должны иметь метод increaseRevenue ( увеличить доход ).

Этот метод должен брать текущий доход пользователя и увеличивать его на некоторую величину, переданную параметром.

Фишка тут в том, что абстрактный метод класса User заставляет программиста реализовывать этот метод в потомках, иначе PHP выдаст ошибку. Таким образом вы, или другой программист, работающий с вашим кодом, никак не сможете забыть реализовать нужный метод в потомке.

Итак, давайте попробуем на практике. Добавим абстрактный метод increaseRevenue в класс User :

Давайте теперь напишем реализацию метода increaseRevenue в классе Employee :

Проверим работу нашего класса:

Некоторые замечания

При наследовании от абстрактного класса, все методы, помеченные абстрактными в родительском классе, должны быть определены в дочернем классе.

Объявления методов также должны совпадать: количество обязательных параметром должно быть одинаковым. Однако класс-потомок может добавлять необязательные параметры, которые не были указаны при объявлении метода в родителе.

Практика

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

Почему класс Figure абстрактный: потому что он не описывает реально существующую геометрическую фигуру и, соответственно, объект этого класса мы не будем создавать.

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

Зачем нам вообще нужен класс Figure : чтобы наследовать от него и таким образом заставить всех наследников реализовать указанные методы.

Итак, напишем реализацию класса Figure :

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

Давайте теперь унаследуем наш класс Quadrate от класса Figure :

Сейчас наша реализация класса Quadrate не рабочая, так как мы не написали реализацию абстрактных методов родителя.

Давайте сделаем это:

Давайте создадим квадрат со стороной 2 и найдем его площадь и периметр:

Усложним

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

Почему мы можем написать реализацию этого метода прямо в классе Figure : потому что этот метод будет одинаковым для всех потомков.

Итак, добавим наш метод:

Применим наш метод:

Источник

Абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

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

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

На первом этапе программирования, новички не понимают смысла и назначения объектно-ориентированного подхода. Смысл понять можно только разрабатывая сложные проекты.

Перед разработкой структуры проекта, не плохо бы представлять, что такое абстрактный класс.

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

Как создать абстрактный php класс

Для качественного усвоения материала предлагаю рассмотреть, всю цепочку взаимодействия классов, на примере упрощенного абстрактного класса Monster, характерного большинству из сегодняшних видео игр:

Задача класса состоит в реализации базовых свойств любого монстра в RPG игре.

К базовым свойствам присущим любой особи можно отнести: размер, вес, статус, местоположение и т.д.

Свойства монстра будут инициализироваться в стандартной базовой функции initialization($arr);

Как использовать абстрактный класс PHP

Т.е. другими словами, дописывается логика абстрактного метода. В данном случаем в примере реализуется смена статуса монстра, при получении события равного единице. Если обработчик поведения подучает событие = 1 то монстр становится агресивным.

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

В данном случае при получении события равному единице, монстр данного класса издаст злобный звук, призывающий к бою. Конечно, никакого звука не будет, мы просто выведем в на страницу текстовое сообщение.

Абстрактный php класс и классы потомки определенны, давайте проверим их работоспособность.

Воспользуемся базовым методом вывода данных об объекте:

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Заставим нашего доброго зомби разозлиться, и передадим событие равное единице в метод обрабатывающий поведение зомби:

Проверим повлияли ли наши действия на зомби… 🙂

Все верно, свойство aggressive приняло значение yes и теперь данный объект является агрессивным.

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Создадим монстра типа Monster_Alien :

Проделаем с ним тоже, что и с Zombie:

В результате увидим такую картину:

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

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

Подведем итоги и закрепим несколько важных особенностей абстрактного класса.

Абстрактные классы не должны содержать реализации метода — они только описывают интерфейс метода. Методы могут быть как обычные так и абстрактные:

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

На этом я не закончу статью об абстрактных классах php, а поведаю вам уважаемые читатели об еще одном механизме расширения возможностей объектов – интерфейсах классов в PHP.

Интерфейсы в PHP

Что же такое интерфейсы, и для чего они нужны?

Интерфейсы объявляются при помощи идентификатора interface перед объявлением класса.

Интерфейсы php очень похожи на абстрактные классы php, но в отличии от них вообще не должны содержать в себе реализации методов. Интерфейс содержит в себе только атрибуты и абстрактные методы.

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

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

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

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

P.S. Не пытайте создать RPG игру на php 🙂

Читайте также похожие статьи:

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Источник

Классы и объекты в PHP: Абстрактные классы и зачем они нужны. Часть 6

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Изучая предыдущие уроки о классах вы уже многое знаете и наверняка думаете, «ну что же еще придумали эти разработчики PHP». И вы правы! Есть такая вещь, как абстрактные классы. Рассмотрим их подробнее.

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

Абстрактный класс нужен когда требуется создать семейство классов, у которых есть что-то общее.

Представьте, что у вас есть магазин (абстрактный класс), а в нем разные типы товаров (обычные классы): велосипеды и машины. Так вот, у каждого типа товара есть что-то общее, например, их можно продать (абстрактный метод). Но к примеру, велосипеды вы можете продать по формуле с одной скидкой, а автомобили по другой. Таким образом, классы велосипед и автомобиль будут использовать один и тот же метод (продать), но функционал будет разный у каждого. А «объединит» это все как раз абстрактный класс.

Создадим такой абстрактный класс:

Теперь создадим классы авто и велосипеда:

Как вы видите в обоих классах мы наследуем данные от абстрактного класса Magazin и используем его метод procent(). Также в обоих классах мы задали метод write($cena), в которых идет подсчет цены товара по разным формулам для велосипеда 10%, для авто 5%.

Если бы мы создали пустой класс, без метода write($cena), то появилась бы справедливая ошибка: Fatal error: Class ProductAuto contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Magazin::write). Означающая, что дочерний класс должен содержать метод write(), который определен в абстрактном суперклассе.

$ProductAuto = new ProductAuto();
echo ‘Цена со скидкой на авто (5%): ‘.$ProductAuto->write(5000);
$ProductVelo = new ProductVelo();
echo ‘
Цена со скидкой на велосипед (5%*2): ‘.$ProductVelo->write(1000);

Таким образом, абстрактные классы позволяют объединять обычные классы и легко использовать свойства и методы самого абстрактного класса, а также быстро создавать/использовать абстрактные методы в наследуемых классах (при этом функционал этих методов может кардинально различаться).

В следующем уроке, рассмотрим интерфейсы в PHP.

Источник

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

PHP 5 поддерживает определение абстрактных классов и методов. Класс, который содержит по крайней мере один абстрактный метод, должен быть определен как абстрактный. Следует помнить, что нельзя создать экземпляр абстрактного класса. Методы, объявленные абстрактными, несут, по существу, лишь описательный смысл и не могут включать реализации.

При наследовании от абстрактного класса, все методы, помеченные абстрактными в родительском классе, должны быть определены в классе-потомке; кроме того, область видимости этих методов должна совпадать (или быть менее строгой). Например, если абстрактный метод объявлен как protected, то реализация этого метода должна быть либо protected либо public, но никак не private. Более того, сигнатуры методов должны совпадать, т.е. контроль типов (type hint) и количество обязательных аргументов должно быть одинаковым. К примеру, если в дочернем классе указан необязательный параметр, которого нет в сигнатуре абстрактного класса, то в данном случае конфликта сигнатур не будет. Это правило также применяется к конструкторам начиная с версии PHP 5.4, ранее сигнатуры конструкторов могли отличаться.

Пример #1 Пример абстрактного класса

class ConcreteClass1 extends AbstractClass
<
protected function getValue () <
return «ConcreteClass1» ;
>

class ConcreteClass2 extends AbstractClass
<
public function getValue () <
return «ConcreteClass2» ;
>

Результат выполнения данного примера:

Пример #2 Пример абстрактного класса

class ConcreteClass extends AbstractClass
<

Результат выполнения данного примера:

Код, предназначенный для прежних версий PHP, должен работать без изменений, если в нём отсутствуют классы или функции, именованные ‘abstract’.

Источник

Для чего используют абстрактные классы?

Вот допустим шаблон кода, которым везде пытаются объяснить полезность абстрактных классов:

Так вот, в чем смысл использовать такую конструкцию, если можно сделать так:

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Все эти интерфейсы, абстрактные классы и т.д и т.п нужно тогда, когда над проектом работает несколько (много) человек, и проект чуть больше чем «свой мегакрутой бложик».

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Просто опишите в общем, подробностей не нужно.

Для чего нужен абстрактный класс php. Смотреть фото Для чего нужен абстрактный класс php. Смотреть картинку Для чего нужен абстрактный класс php. Картинка про Для чего нужен абстрактный класс php. Фото Для чего нужен абстрактный класс php

Полиморфизм типов часто применяется в php. Вот его суть на вашем примере:

Зачем это нужно?
Это нужно тогда, когда у вас может быть несколько реализаций одного и того же компонента. И вы точно знаете, что в будущем вам может понадобиться другая реализация. Например, представьте себе класс кеширования. Согласитесь, что кешировать можно в файл, можно в базу, можно в память и т.д. В таком случае, вы можете выделить абстракцию Cache с общим функционалом для любой реализации и создать наследников CacheFile, CacheMysql, CacheRedis и т.д.

Теперь когда вам понадобится компонент кеша, то вы можете внедрить его через параметр метода, который параметризирован типом Cache, если такому методу дать что-то другое, то интерпретатор кинет исключение. Вы же получаете гибкость. В любое время вы можете заменить реализацию компонента кеша на другой, просто передав в метод другой дочерний объект абстрактного класса Cache. Вы уже точно знаете, какой у него должен быть контракт и точно знаете, что вам не нужно вносить исправления в тот метод, который использует ваш класс Cache. Вы молодцы, ведь вы только что применили полиморфный принцип открытости/закрытости, одного из принципов SOLID а это значит, что ваш код стал чуть лучше.

Но, скорее всего, если вы ничего об этом не слышали, то вам следует обязательно познакомиться с Dependency injection container, который будет внедрять нужный компонент автоматически, вместо вас. Вы же лишь будете указывать в конфигах, какую именно реализацию компонента нужно подавать всему остальному коду. Тогда весь ваш проект сможет переезжать с CacheFile на CacheRedis и наоборот с помощью изменения всего одной строчки в конфиге.

Также, если у компонента нет общей реализации, которую можно вынести в абстрактный класс, то вместо него, стоит использовать интерфейс. Идея остается. Полиморфно замещать различные реализации.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *