В этой части учебника мы разберём PHP наследование классов, пожалуй самую важную тему в ООП, да и вообще в программирование в целом, также здесь расскажу как наследовать из нескольких классов.
Что такое наследование в ООП:
Уже по названию можно понять что это концепция ООП, которая означает возможность наследовать свойства и методы одного класса, другим.
Этот принцип очень часто используется в программирование, поэтому, его обязательно стоит изучить и научится с ним работать.
Для чего нужно наследование:
Они используются в паттерном проектирование, если грубо говоря, это когда есть шаблон класс, в котором есть какие-то базовые компоненты для работы программы, вы можете его наследовать и модифицировать как вам надо, такой подход используют все WEB фреймворки.
Если вы не знаете что такое фреймворк, то прочитайте эту статью:
«Зачем нужен фреймворк и что это вообще такое»
Наследование в PHP:
Наследовать в PHP можно через ключевое слово extends
, вот вам пример.
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 | // Создаём класс User class User { // Объявление свойства name и surname public $name; public $surname; // Конструктор класса public function __construct ($name, $surname) { $this -> name = $name; $this -> surname = $surname; } // Метод для вывода имени public function show_name () { echo "Имя: " . $this -> name . "</br>"; echo "Фамилия: " . $this -> surname . "</br>"; } } // Создаём наследуемый класс Admin class Admin extends User { // Объявление свойства status c значением admin public $status = 'admin'; // Конструктор класса public function __construct ($name, $surname) { // Вызов конструктора наследуемый класса parent::__construct($name, $surname); } // Метод для вывода имени public function show_name () { // Вызов метода show_name() parent::show_name(); echo "Статус: " . $this -> status . "</br>"; } } // Создаём объект класса Admin $admin = new Admin("Вова", "Пупкин"); $admin -> show_name(); |
Вот результат.
Как видите всё работает, но давайте разберём код подробнее, в начале идёт класс User, мы его разбирали в прошлых частях.
Самое интересное, это класс Admin, он наследуется от User, с помощью ключевого слова extends
, после пишем название унаследованного класса.
В конструкторе класса Admin, мы сталкиваемся с двумя новыми вещами, это слово parent
и оператор разрешения области видимости ::
.
parent
, позволяет вызвать родительский метод, а оператор ::
, обращаться к статичным свойствам, методам, и также, как можете заметить обращаться к родительским методам.
Больше, нечего нового в этой программе нет, думаю всё понятно, если же нет, то пишите комментарии.
Область видимости:
В прошлой части мы уже изучали область видимости, теперь пришло время показать как это работает с наследованием.
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 | // Создаём класс User class User { // Объявление свойств public $name; // name public или публичный private $surname; // surname private или приватный protected $age; // $age protected // Конструктор класса public function __construct ($name, $surname, $age) { $this -> name = $name; $this -> surname = $surname; $this -> age = $age; } // Метод для вывода имени public function show_name () { echo "Имя: " . $this -> name . "</br>"; echo "Фамилия: " . $this -> surname . "</br>"; echo "Возраст: " . $this -> age . "</br>"; } } // Создаём наследуемый класс Admin class Admin extends User { // Объявление свойства status c значением admin public $status = 'admin'; // Конструктор класса public function __construct ($name, $surname, $age) { // Вызов конструктора класса который наследовали parent::__construct($name, $surname, $age); } // Метод для вывода имени public function show_name () { // Вызов метода show_name() parent::show_name(); echo "Статус: " . $this -> status . "</br>"; } } |
Мы в основном изменили класс User
, сначала выведем свойства через объект.
1 2 3 4 5 6 7 | // Создаём объект класса User $user = new User("Саша", "Обломов", 24); // Вывод свойств на прямую через объект $user echo "Имя: " . $user -> name . "</br>"; echo "Фамилия: " . $user -> surname . "</br>"; echo "Возраст: " . $user -> age . "</br>"; |
Вот какой результат.
Как видите, когда доходит до фамилии, то он выводит ошибку, но это понятно, у нас фамилия приватный, но с возрастом будет такая же ошибка, он имеет protected
.
Теперь результат, если выводить через метод show_name()
.
Всё нормально выводит.
Разберём класс Admin
, как он будет выводить данные.
1 2 3 4 5 6 7 | // Создаём объект класса Admin $admin = new Admin("Вова", "Пупкин", 30); // Вывод свойств на прямую через объект $admin echo "Имя: " . $admin -> name . "</br>"; echo "Фамилия: " . $admin -> surname . "</br>"; echo "Возраст: " . $admin -> age . "</br>"; |
Вот результат.
Фамилию теперь вообще не выводит, напомню, фамилия приватна, а вот когда выводим возраст, появляется ошибка.
Если выводить данные через метод show_name()
, то всё нормально выводится.
То есть, protected
надо использовать когда вы собираетесь наследовать этот класс, с другой стороны, приватная область видимости не чего не выводит, хотя так вы не сразу поймёте в чем ошибка, а с protected
, вы сразу всё поймёте.
Вывод:
В этой части учебника разобрали в PHP наследование классов, это пожалуй одна из важнейших тем в ООП, надеюсь всё было понятно.