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

Представьте, что у вас есть класс `User`. Он нужен вам для каких-то целей и в общем-то полностью вас устраивает - доработки этому классу в не нужны.

Вот этот класс:

`<?php class User { private $name; private $age; public function getName() { return $this->name; } public function setName($name) { $this->name = $name; } public function getAge() { return $this->age; } public function setAge($age) { $this->age = $age; } } ?>`

А теперь представим себе ситуацию, когда нам понадобился еще и класс `Employee`. Работник очень похож на юзера, имеет те же свойства и методы, но еще и добавляет свои - свойство `salary`, а также геттер и сеттер для этого свойства. Вот этот класс:

`<?php class Employee { private $name; private $age; private $salary; // зарплата // Геттер зарплаты public function getSalary() { return $this->salary; } // Сеттер зарплаты public function setSalary($salary) { $this->salary = $salary; } public function getName() { return $this->age; } public function setName($name) { $this->name = $name; } public function getAge() { return $this->age; } public function setAge($age) { $this->age = $age; } } ?>`

Как мы видим, код классов `User` и `Employee` практически полностью совпадает. Было бы намного лучше сделать так, чтобы общая часть была записана только в одном месте.

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

Класс, от которого наследуют называется родителем (англ. parent), а класс, который наследует - потомком. Класс-потомок наследует только публичные методы и свойства, но не приватные.

Наследование реализуется с помощью ключевого слова `extends` (переводится как расширяет). Перепишем наш класс `Employee` так, чтобы он наследовал от `User`:

`<?php class Employee extends User { private $salary; public function getSalary() { return $this->salary; } public function setSalary($salary) { $this->salary = $salary; } } ?>`

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

`<?php $employee = new Employee; $employee->setSalary(1000); // метод класса Employee $employee->setName('john'); // метод унаследован от родителя $employee->setAge(25); // метод унаследован от родителя echo $employee->getSalary(); // метод класса Employee echo $employee->getName(); // метод унаследован от родителя echo $employee->getAge(); // метод унаследован от родителя ?>`

Класс-потомок не унаследовал от своего родителя приватные свойства `name` и `age` - попытка обратится к ним вызовет ошибку. При этом, однако, в классе-потомке доступны геттеры и сеттеры этих свойств, так как эти геттеры и сеттеры являются публичными.

Не подсматривая в мой код реализуйте такие же классы `User`, `Employee`.

## Несколько потомков

Преимущества наследования в том, что каждый класс может несколько потомков. Давайте посмотрим на примере. Пусть кроме работника нам нужен еще и класс `Student` - давайте также унаследуем его от `User`:

`<?php class Student extends User { private $course; // курс public function getCourse() { return $this->course; } public function setCourse($course) { $this->course = $course; } } ?>`

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

`<?php $student = new Student; $student->setCourse(3); // метод класса Student $student->setName('john'); // метод унаследован от родителя $student->setAge(25); // метод унаследован от родителя echo $student->getCourse(); // метод класса Student echo $student->getName(); // метод унаследован от родителя echo $student->getAge(); // метод унаследован от родителя ?>`

Не подсматривая в мой код реализуйте такой же класс `Student`, наследующий от класса `User`.

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

Пусть у нас есть класс-родитель и класс-потомок. От этого потомка также могут наследовать другие классы, от его потомков другие и так далее. Для примера пусть от класса `User` наследует `Student`, а от него в свою очередь наследует класс `StudentBSU`:

`<?php class StudentBSU extends Student { // добавляем свои свойства и методы } ?>`

Сделайте класс `Programmer`, который будет наследовать от класса `Employee`. Пусть новый класс имеет свойство `langs`, в котором будет хранится массив языков, которыми владеет программист. Сделайте также геттер и сеттер для этого свойства.

Сделайте класс `Driver` (водитель), который будет наследовать от класса `Employee`. Пусть новый класс добавляет следующие свойства: водительский стаж, категория вождения (A, B, C, D), а также геттеры и сеттеры к ним.

←→
↑