Php declare class abstract

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

Пусть у вас есть класс User , а от него наследуют классы Employee и Student .

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

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

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

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

Итак, давайте напишем реализацию абстрактного класса User . Пусть у него будет приватное свойство name , а также геттеры и сеттеры для него:

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

А вот унаследовать от нашего класса будет можно. Сделаем класс Employee , который будет наследовать от нашего абстрактного класса User :

Создадим объект класса Employee — все будет работать:

setName(‘john’); // метод родителя, т.е. класса User $employee->setSalary(1000); // свой метод, т.е. класса Employee echo $employee->getName(); // выведет ‘john’ echo $employee->getSalary(); // выведет 1000 ?>

Аналогично можно создать объект класса Student , наследующий от User :

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

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

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

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

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

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

Сам класс User не знает, какой именно доход будет получать наследник — ведь у работника это зарплата, а у студента — стипендия. Поэтому каждый потомок будет реализовывать этот метод по-своему.

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

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

Читайте также:  Экранировать символ в php

name; > public function setName($name) < $this->name = $name; > // Абстрактный метод без тела: abstract public function increaseRevenue($value); > ?>

Пусть наш класс Employee пока останется без изменений. В этом случае, даже если не создавать объект класса Employee , а просто запустить код, в котором определяются наши классы, — PHP выдаст ошибку.

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

salary; > public function setSalary($salary) < $this->salary = $salary; > // Напишем реализацию метода: public function increaseRevenue($value) < $this->salary = $this->salary + $value; > > ?>

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

setName(‘john’); // установим имя $employee->setSalary(1000); // установим зарплату $employee->increaseRevenue(100); // увеличим зарплату echo $employee->getSalary(); // выведет 1100 ?>

Реализуем метод increaseRevenue и в классе Student . Только теперь наш метод будет увеличивать уже стипендию:

scholarship; > public function setScholarship($scholarship) < $this->scholarship = $scholarship; > // Метод увеличивает стипендию: public function increaseRevenue($value) < $this->scholarship = $this->scholarship + $value; > > ?>

Добавьте в ваш класс User такой же абстрактный метод increaseRevenue . Напишите реализацию этого метода в классах Employee и Student .

Добавьте также в ваш класс User абстрактный метод decreaseRevenue ( уменьшить зарплату ). Напишите реализацию этого метода в классах Employee и Student .

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

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

При этом область видимости этих методов должна совпадать или быть менее строгой. Что значит менее строгой: например, если абстрактный метод объявлен как protected , то реализация этого метода должна быть protected или public , но не private .

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

Практика

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

Давайте сделаем для этого абстрактный класс Figure с двумя абстрактными методами getSquare и getPerimeter .

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

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

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

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

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

Читайте также:  Python object oriented structure

Давайте для этого сделаем приватное свойство $a , значение которого будет задаваться в конструкторе класса:

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

a = $a; > > /* Код класса не рабочий и будет выдавать ошибку, так как мы не написали реализацию методов родителя. */ ?>

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

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

Сделайте аналогичный класс Rectangle ( прямоугольник ), у которого будет два приватных свойства: $a для ширины и $b для длины. Данный класс также должен наследовать от класса Figure и реализовывать его методы.

Усложним

Сейчас все методы класса Figure — абстрактные. Это, конечно же, не обязательно. Пусть наш класс имеет еще и метод getRatio , который будет находить отношение площади к периметру (то есть одно делить на второе).

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

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

Обратите внимание на следующее: хотя методы getSquare и getPerimeter абстрактные и не имеют реализации, мы их все равно можем использовать в своем методе getRatio , хотя реализация этих методов появится только в потомках.

getSquare(); // выведет 4 echo $quadrate->getPerimeter(); // выведет 8 echo $quadrate->getRatio(); // выведет 0.5 ?>

Добавьте в класс Figure метод getSquarePerimeterSum , который будет находить сумму площади и периметра.

Источник

PHP Abstract Classes

In any software application, not all of the logic of the program is shown to the end user. With the help of OOP, the code implementation remains hidden, which is called data abstraction. This tutorial explains the Abstract class and how it relates to the object-oriented approaches of PHP. We will also see how to implement an abstract class with some examples.

What is Abstract Class?

An abstract class in PHP is a class that cannot be instantiated on its own but can be extended by other classes. An abstract class is a blueprint for one or more derived classes. It defines a set of common methods that the derived classes must implement, but it does not provide an implementation for those methods.

An abstract class is a mixture of a class and an interface. It specifies both functionality and user interface. We cannot instantiate an abstract class, and every abstract class with at least one abstract method must be abstract. If we define a Method as abstract, it signifies the Signature of the Method.

Declaring an Abstract Class

To declare an abstract class in PHP, use the abstract keyword before the class keyword. Here is an example of how to declare an abstract class:

Читайте также:  Java if directory is empty

Declaring Abstract Methods

An abstract method is a method that is declared in an abstract class but does not have an implementation. Abstract methods are used to define the interface for a class but leave the implementation up to the child class.

To declare an abstract method in PHP, use the abstract keyword before the method signature. Abstract methods must not have a body, as they do not have an implementation.

In the example above, the Shape class has two abstract methods, area and perimeter , that must be implemented by any class that extends Shape.

Extending an Abstract Class

To create a new class that extends an abstract class, use the extends keyword. The child class must implement all abstract methods declared in the parent class.

class Circle extends Shape < private $radius; public function __construct($radius) < $this->radius = $radius; > // Implementing the abstract methods public function area() < return pi() * pow($this->radius, 2); > public function perimeter() < return 2 * pi() * $this->radius; > > 

In the example above, the Circle class extends the Shape class and implements the area and perimeter methods.

Using Abstract Classes

To use an abstract class, you must create an instance of a derived class that implements all the abstract methods of the abstract class. You cannot create an instance of the abstract class itself.

Here is an example of how to use the Circle class we defined above:

$circle = new Circle(5); echo $circle->area(); // 78.5398163397448 echo $circle->perimeter(); // 31.41592653589793 

Abstract Properties

In addition to abstract methods, an abstract class can also have abstract properties. Abstract properties are like abstract methods, but do not have a body and are declared using the var keyword.

Here is an example of an abstract class with an abstract property:

The derived class must define the value of the abstract property. Here is an example of a derived class that defines the value of the color property:

class Circle extends Shape < private $radius; // Defining the value of the abstract property var $color = 'red'; public function __construct($radius) < $this->radius = $radius; > // Implementing the abstract methods public function area() < return pi() * pow($this->radius, 2); > public function perimeter() < return 2 * pi() * $this->radius; > > 

Conclusion

Abstract classes are a helpful tool in object-oriented programming, as they allow you to define an interface for a class and leave the implementation up to the child classes. Remember that abstract classes cannot be instantiated directly and that child classes must implement all abstract methods declared in the parent class.

Источник

Оцените статью