зачем нужен абстрактный класс 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?

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

Объявление абстрактных классов

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

Синтаксис

Объявление абстрактных методов

Когда вы добавляете ключевое слово abstract к объявлению метода, он становится абстрактным методом. И помните, абстрактные методы не имеют тела. Поэтому фигурные скобки <> не используются.

Пример

Правила абстракции

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

Видимость абстрактного методаВидимость дочернего метода
publicpublic
protectedprotected или public, но не private

Не абстрактные методы в абстрактном классе

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

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

Давайте расширим приведенный выше пример и включим в наш класс неабстрактный метод myMethod2:

Пример

Примечание: В этом основное отличие абстрактных классов от интерфейсов. Абстрактные классы могут иметь реальные методы, а интерфейсы могут иметь только объявления методов.

Пример абстрактного класса в PHP ООП

Родительский абстрактный класс:

Пример

Как создать дочерние классы из абстрактного класса?

Примечание: Дочерние классы, которые наследуются от абстрактных классов, должны добавлять тела к абстрактным методам.

Давайте создадим дочерние классы и определим в них абстрактный метод, унаследованный от родителя, greet():

Пример

Теперь мы можем создавать объекты из дочерних классов:

Пример

Полный код рассмотренного примера абстрактного класса:

Пример

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

Заключение

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

Источник

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

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

Изучая предыдущие уроки о классах вы уже многое знаете и наверняка думаете, «ну что же еще придумали эти разработчики 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?

Простой 15 комментариев

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

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

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

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

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

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

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

Абстрактный класс- это реальные инструменты, необходимые для
1) повышения Читабельности кода
2) Уверенности в том, что делает код

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

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

Да, носят чисто декларативный характер

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

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

Попробуйте написать классы для этого примера.

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

С интерфейсами самый простой кейс:

1) Пишем какую-то функцию, которая принимает в качестве аргумент интерфейс.
2) Функция работает с методами интерфейса и получает какой-то результат.
3) Где-то есть отдельная логика, выбора конкретной реализации класса, который выполняет интерфейс.

Т.е. допустим, у нас есть онлайн-касса и есть 20 методов платежей. Сама онлайн-касса работает с интерфейсом проводки платежа, а как проводить платежи реализовано в конкретных классах платежных систем.

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

Абстрактный класс. ну допустим, мы далем абстрактный класс DTO, который выполняет методы to_string и normalize. Наследуюясь от этого абстрактного класса, мы во всех DTO получаем методы to_string и normalize. Плюс защищаемся от того, что кто-то решит нам запороать этот абстрактный класс, либо «решит» что-то сломать в своем DTO

Ну вообще, это все нужно, если ты пишешь хороший проект на Symfony командой. Если это какой-то бложит или небольшой новостник, тебе это все не нужно.

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

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

> и в этом случае интерпретатор будет знать как перебрать коллекцию в цикле foreach.

Я бы сказал, что, как раз знать как перебрать он не будет, но сможет, тем не менее, заставить её перебраться. 🙂 Это немного тонкая разница, но тем не менее.

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

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

1. Абстрактный класс нельзя создать, только создать обьект от наследуемого класса
2. Абстрактный класс может содержать реализацию, в отличии от интерфейса
3. Абстрактный класс может содержать абстрактные методы, которые необходимо будет реализовать в дочерних классах
4. Можно имплементировать сразу несколько интерфейсов, а наследовать только от одного класса.
5. Трейты очень хорошо комбинируются с интерфейсами

Осознание зачем это нужно, прийдёт к вам в процессе использования)) Почитайте также про SOLID, и попробуйте реализовать эти принципы без абстракций и интерфейсов)

P.S. Домашнее задание
Есть три класса. Квадрат, Прямоугольник, Круг. И класс Ящик. Мы добавляем в ящик, произвольные наборы из фигур, и нужно посчитать площадь всех фигур в ящике.

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

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

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

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

Ruslan Ruslanov, Зачем указывать квадрату две стороны? Это же квадрат, у него стороны равны

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

P.S. Домашнее задание
Есть три класса. Квадрат, Прямоугольник, Круг. И класс Ящик. Мы добавляем в ящик, произвольные наборы из фигур, и нужно посчитать площадь всех фигур в ящике.

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

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

Вот рекомендую это изучить, а как поймете, о чём речь и для чего это всё. Тогда можно уже смело отбрасывать всё и делать как хочется)
https://ota-solid.now.sh/

P.S. В любом случае, это очень часто спрашивают на собеседованиях, так что если ваши планы более грандиозны, чем маленький самописный проект, который вы сами разрабатываете и не меняете в нём ничего, то стоит подготовится

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

но тогда просто будет сложно работать.

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

он (абстрактный класс) носит чисто декоративный характер, нужен для ограничения действий разработчика, удобства разработки и вообще это лишь «сахар?.

Источник

Зачем нужны абстрактные классы (PHP)?

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

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

Интерфейс нужен обычно, когда описывается только интерфейс (тавтология). Например, один класс хочет дать другому возможность доступа к некоторым своим методам, но не хочет себя «раскрывать». Поэтому он просто реализует интерфейс.

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

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

Анна Б: вы стучитесь в методы наследников не через абстрактный класс, а напрямую.
Вы в своем приложении создаете новый объект и используете его методы.
например
$airplains = new Airplains ; // Тут создается объект
$airpalins->getEngine(); // Тут получается свойство объекта, которое он наследовал от абстрактного класса, либо какое-то свое свойство. В моем примере это двигатель.
$airplains->move(); // тут использование метода движение, которое было унаследовано у абстрактного, но сама реализация этой функции в классе Самолет.

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

Источник

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

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