Наследование классов

Наследование — это механизм, при котором из существующего класса можно получить еще один класс с дополненным функционалом. Связь между такими классами описывают с помощью соотношения «родительский класс и дочерний класс». Дочерний происходит от родителя и наследует его свойства и методы. Часто говорят, что дочерний класс расширяет родительский.

Зачем это нужно?

Не всегда удается предусмотреть все возможные особенности в классе. Часто потребность в расширении функционала появляется спустя значительное время, после создания класса. Допустим, что класс BigCar который рассматривали в предыдущем уроке, не описывает необходимый функционал и его нужно расширить. Так добавим туда свойства описывающие тип бензина, наличие гибридной установки, стоимость. Также, добавим метод, который описывает через сколько лет окупится покупка гибридного авто(считаем, что в месяц окупается k(коэффициент) стоимости гибридного авто).

Код класса BigCar до создания дочернего класса:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
class BigCar
{
    public $name = 'ТАЗ';
    public $weight = 1400;
    public $speed= 160;
 
    function printCar()
    {
        echo $this->name;
        echo $this->weight;
        echo $this->speed;
    }
    function __construct($name, $weight, $speed) {
      $this->name=$name;
      $this->weight=$weight;
      $this->speed=$speed;
    }
}
 
?>

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

1
2
3
class EcoCar extends BigCar {
	дополнительные свойства и методы
}

Мы не определяли новый конструктор класса. Поэтому при создании нового объекта вынуждены работать с конструктором класса BigCar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
class EcoCar extends BigCar {
  public $gasType = 92;
  public $cost = 98000;
  public $hybrid = true;
  private $k = 0.04;
 
  public function money() {
    $a=round((1/$this->k)/12);
     echo '<br>Авто окупится через '.$a.' месяцев';
  }
}
 
$toyota = new EcoCar('Toyota', 1900, 230, 95, 500000, true, 0.06);
$toyota->printCar();
?>

При создании объекта toyota используется старый конструктор. Поэтому прописывание новых свойств не позволяет занести их в объект.

Добавим в дочерний класс функцию конструктор:

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
42
43
44
45
46
47
48
49
<?php
class BigCar
{
    public $name = 'ТАЗ';
    public $weight = 1400;
    public $speed= 160;
 
    function printCar()
    {
        echo $this->name;
        echo $this->weight;
        echo $this->speed;
    }
    function __construct($name, $weight, $speed) {
      $this->name=$name;
      $this->weight=$weight;
      $this->speed=$speed;
    }
}
 
class EcoCar extends BigCar {
  public $gasType = 92;
  public $cost = 98000;
  public $hybrid = true;
  private $k = 0.04;
 
  public function money() {
    $a=round((1/$this->k));
     echo '<br>Авто окупится через '.$a.' месяцев';
  }
	function __construct($name, $weight, $speed, $gasType, $cost, $hybrid, $k) {
      $this->name=$name;
      $this->weight=$weight;
      $this->speed=$speed;
      $this->gasType=$gasType;
      $this->cost=$cost;
			$this->hybrid=$hybrid;
			$this->k=$k;
    }
 
}
 
$toyota = new EcoCar('Toyota', 1900, 230, 95, 500000, true, '0.04');
$toyota->printCar();
echo '<br>';
print_r($toyota);
$toyota->money();
 
?>

Итак, мы создали конструктор для класса EcoCar. Теперь мы можем просто и удобно заполнять обьекты при создании.

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

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

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