Добавить в корзинуПозвонить
Найти в Дзене
WebTechnology

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

В прошлой статье мы рассмотрели механизм наследования классов в PHP. Действительно, этот механизм очень классный, однако, давайте задумаемся: "Почему ООП настолько удобно?". Я видел много суждений, но для меня оно удобно тем, что ООП - это аналог реальной жизни. Ведь вокруг нас одни сплошные объекты: деревья, травы, дома, леса, автомобили, дороги и другие объекты, которые мы ежедневно видим перед своими глазами. И ООП - это механизм, позволяющий перенести реальность в программный код, и тогда программа становится очень простой для использования и понимания. Также в нашем мире существует много абстрактностей. Например, что такое "млекопитающее"? Согласитесь, что это абстрактность, ведь нельзя однозначно представить себе млекопитающее. А вот кошку, относящуюся к млекопитающим, уже можно. Безусловно, кошки тоже бывают разных пород, поэтому, в некотором смысле, и кошка - это не более, чем абстрактность. Но всё зависит от того, насколько точно Вы хотите описать объекты. И для представления

В прошлой статье мы рассмотрели механизм наследования классов в PHP. Действительно, этот механизм очень классный, однако, давайте задумаемся: "Почему ООП настолько удобно?". Я видел много суждений, но для меня оно удобно тем, что ООП - это аналог реальной жизни. Ведь вокруг нас одни сплошные объекты: деревья, травы, дома, леса, автомобили, дороги и другие объекты, которые мы ежедневно видим перед своими глазами. И ООП - это механизм, позволяющий перенести реальность в программный код, и тогда программа становится очень простой для использования и понимания. Также в нашем мире существует много абстрактностей. Например, что такое "млекопитающее"? Согласитесь, что это абстрактность, ведь нельзя однозначно представить себе млекопитающее. А вот кошку, относящуюся к млекопитающим, уже можно. Безусловно, кошки тоже бывают разных пород, поэтому, в некотором смысле, и кошка - это не более, чем абстрактность. Но всё зависит от того, насколько точно Вы хотите описать объекты. И для представления абстрактных объектов в PHP существует возможность создавать абстрактные классы.

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

Для того, чтобы закрепить полученные знания, давайте перепишем задачу из прошлой статьи, но с использованием абстрактного класса. Начнём с класса "Car", представляющего "абстрактный автомобиль" (файл "car.php"):

<?php
abstract class Car {
public $x;
public $y;
public function __construct($x, $y) {
      $this->x = $x;
      $this->y = $y;
}
abstract public function move ($x, $y);
abstract public function sound();
}
?>

Как видите мы поставили ключевое слово "abstract", означающее, что данный класс является абстрактным. В этом классе мы реализовали конструктор (напоминаю, что создать объект абстрактного класса нельзя). Также описали два абстрактных метода. Под описанием подразумевается определение модификатора доступа, названия функции и входных параметров. А реализовываться эти методы должны в классах-наследниках.

Теперь посмотрите, какой вид имеет класс "Легковой автомобиль", который, в нашем случае, является уже не абстрактностью, а конкретной моделью (файл "auto.php"):

<?php
  require_once "car.php";
class Auto extends Car {
public function move($x, $y) {
      $this->sound();
      echo "Движение легкового автомобиля из координат ($this->x, $this->y) в координаты ($x, $y)<br />";
      $this->x = $x;
      $this->y = $y;
}
public function sound() {
      echo "Звук движения легкового автомобиля<br />";
}
}
?>

В данном примере мы реализовали два абстрактных метода, пришедших из класса "Car", родителя для класса "Auto".

И, наконец, давайте поиграемся с объектом "Auto":

<?php
  require_once "auto.php";
  $auto = new Auto(10, 20);
  echo $auto->x;
  echo "<br />";
  echo $auto->y;
  echo "<br />";
  $auto->move(5, 15);
?>

Как видите, мы создали объект "Auto", вывели его свойства, воспользовались методом движения. Ничего сложного тут нет.

Возможно, что Вы скажете: "А что улучшилось-то?". А улучшилось следующее: мы приблизились к реальности, а, следовательно, улучшили понимание структуры программы, упростили её код. Глупо и неразумно создавать некие "абстрактные объекты", тем самым, плодя ненужные реализации "абстрактных методов". А наш пример имеет минимум кода, без реализации абстрактности, которая, в общем-то, и не нужна.