Наследование классов в PHP. Что такое родительский класс и как его использовать?

наследование классов в php. что такое родительский класс и как его использовать?

Основы наследования классов

В процессе написания PHP-скриптов возникают ситуации, когда разные классы имеют схожее поведение. Это совершенно нормально, и является сигналом к использованию наследования.

Например, у вас есть два класса: BigDog (англ. большая собака) и SmallDog (англ. маленькая собака). Они имеют одинаковые свойства: цвет глаз, окрас шерсти, название породы. Обе собаки умеют вилять хвостом и гавкать. Поэтому их методы тоже будут повторяться.

Нет смысла писать один и тот же программный код для обоих классов. К тому же появление MiddleDog (англ. Собака среднего размера), снова потребует копирования уже существующего функционала. Есть и другая проблема. Если вы захотите изменить поведение одного из «собачьих» классов, то, скорее всего, придется редактировать и остальные.

PHP позволяет решить эту проблему с помощью наследования классов. Оно привязывает методы и свойства одного класса к другому. Для наследования используйте инструкцию extend. Её нужно указать при определении класса, сразу за его именем. Выражение в общем виде можно записать как «class ИмяКласса extend ИмяНаследуемогоКласса {/* определение свойств и методов */ }».

//Определяем класс с общим функционалом
class Dog
{
    //свойство окраса шерсти
    public $hairColor;

    //свойство имени собаки
    public $dogName;

    //метод вывода информации
    public function showDogInfo()
    {
        echo "Кличка собаки: {$this->dogName}<br>";
        echo "Цвет шерсти: {$this->hairColor}<br>";
    }
}

//Определяем класс большой собаки, который
//наследует класс обычной собаки
class BigDog extends Dog
{
    //метод громкого гавканья
    public function loudBark()
    {
        echo 'Гав! Гав! Гав...';
    }
}

//Создаем экземпляр большой собаки
$myDog = new BigDog();
$myDog->hairColor = 'дымчатый';
$myDog->dogName = 'шарик';

//Вызываем унаследованный метод
$myDog->showDogInfo();
/*
* Результат:
* Кличка собаки: шарик
* Цвет шерсти: дымчатый
*/

//Вызываем собственный метод
$myDog->loudBark();
/*
* Результат:
* Гав! Гав! Гав...
*/

По сложившейся терминологии, наследуемый класс называют родительским, а наследующий – дочерним.

Заметка
PHP не поддерживает множественное наследование. После инструкции extend можно указать только один родительский класс. Трудно сказать, является это достоинством или недостатком. Нужно отметить, что неумелое обращение с множественным наследованием в других языках программирования является причиной очень серьезных проблем.

Обращение к родительскому классу

Все методы и свойства, определенные в родительском классе, будут прикреплены к дочернему (исключения из этого утверждения рассматриваются в следующих статьях). Но, если дочерний класс определяет одноименные свойства и методы, то они заменят родительские.

//Определяем класс "Радио"
class Radio
{
    //Метод проигрывания музыки
    public function playMusic()
    {
        echo 'Классическая музыка...';
    }
}

//Определяем класс "Альтернативное радио"
class AlternativeRadio extends Radio
{
    //Заменяем метод родителя
    public function playMusic()
    {
        echo 'Альтернативная музыка...';
    }
}

//Создаем экземпляр альтернативного радио
$radio = new AlternativeRadio();
$radio->playMusic();
/*
* Результат:
* Альтернативная музыка...
*/

При вызове метода дочернего класса вы можете выполнить какую-то логику и передать управление в одноименный метод родительского класса. PHP реализует такую возможность с помощью ключевого слова parent и оператора разрешения области видимости, который записывается двумя двоеточиями «::». Выражение в общем виде записывается как «parent::имяМетода(/* список параметров */);».

//Определяем класс "Автомобиль"
class Car
{
    //Метод движения автомобиля вперед
    public function goAhead()
    {
        echo 'Едем по прямой...<br>';
    }
}

//Определяем класс "Спортивный автомобиль"
class SportCar extends Car
{
    //Внутри метода вызываем родительский
    public function goAhead()
    {
        parent::goAhead();
        echo 'Очень быстро!!!<br>';
    }
}

//Создаем экземпляр и вызываем метод
$sportCar = new SportCar();
$sportCar->goAhead();
/*
* Результат:
* Едем по прямой...
* Очень быстро!!!
*/

Последние публикации