PHP 5 about PHP 5 старт PHP 5 установка PHP 5 синтаксис PHP 5 змінні PHP 5 echo і print PHP 5 типи даних PHP 5 strings PHP 5 константи PHP 5 оператори PHP 5 if...else...elseif PHP 5 switch PHP 5 цикл while PHP 5 for і foreach PHP 5 функції PHP 5 масиви PHP 5 сортування масивів PHP 5 superglobals PHP 5 форми input PHP 5 форми обробка PHP 5 форми - обов'язкові поля PHP 5 форми - перевірка електронної пошти і URL РНР 5 форми заповнення PHP 5 багатовимірні масиви PHP 5 час і дата PHP 5 include PHP 5 файли обробка PHP 5 файли Open/Read/Close PHP 5 файли створення / запис PHP 5 файли завантаження PHP MySQL бази даних PHP MySQL Підключення PHP MySQL Створення бази даних PHP MySQL Створення таблиці PHP MySQL вставка даних PHP MySQL Отримання ідентифікатора останнього доданого запису PHP MySQL вставка кількох записів PHP MySQL Підготовлені вирази PHP MySQL відображення даних з таблиці PHP MySQL Видалення даних PHP MySQL оновлення даних PHP MySQL обмежити вибірку даних PHP регулярні вирази 1 PHP регулярні вирази 2 PHP регулярні вирази 3 PHP регулярні вирази 4 PHP ООП PHP ООП class PHP ООП модифікатори доступу PHP ООП extends PHP ООП статичні методи і властивості, константи PHP ООП abstract PHP ООП interface PHP альтернативний синтаксис керуючих конструкцій

PHP ООП extends


Наслідування (extends) є одним з основних аспектів об'єктно-орієнтованого програмування. Наслідування дозволяє перевизначити функціонал вже наявних класів в класах-спадкоємців. Якщо у нас є якийсь клас, в якому не вистачає пари функцій, то набагато простіше перевизначити наявний клас, написавши пару рядків, ніж створювати новий з нуля, переписуючи купу коду.

Щоб наслідувати один клас від іншого, нам треба застосувати інструкцію extends . Наприклад, успадкуємо клас Customer від класу User :

<?php

class User
{
    public $name, $age;

    function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    function getClassInfo()
    {
        echo "Клас User описує користувачів<br />";
    }

    function getInfo()
    {
        echo "Імя: $this->name ; Вік: $this->age <br />";
    }
}

class Customer extends User
{
    public $account, $sum;

    function __construct($name, $age, $acc)
    {
        // виклик конструктора батьківського класу
        parent::__construct($name, $age);
        $this->account = $acc;
        $this->sum = 20;
    }

    // приховує батьківський метод getClassInfo()
    function getClassInfo()
    {
        echo "Клас Customer описує клієнтів <br />";
    }

    function getInfo()
    {
        parent::getInfo();
        echo "Номер рахунку $this->account ; Сума: $this->sum <br />";
    }
}

$client = new Customer("John", 25, "1234567890");

$client->getInfo();           //  Імя: John ; Вік: 25     //  Номер рахунку 1234567890 ; Сума: 20 
$client->getClassInfo();    //  Клас Customer описує клієнтів

?>

Клас Customer успадковує від класу-батька User весь функціонал, а також додає дві додаткові властивості $account і $sum . І незважаючи на те, що властивість $name визначено в класі User , його також можна отримати з класу Customer : $this->name

Якщо в класі-спадкоємця визначено метод з тим же ім'ям, що і в класі-батьку, то метод класу-спадкоємця заміщає метод класу-батька. У нашому випадку в обох класах визначено метод getClassInfo() , тому Customer буде звертатися до свого методу getClassInfo() .

Якщо нам треба звернутися до методу батьківського класу, то ми можемо використовувати інструкцію parent :

parent::getInfo();

І при виклику методу getInfo() з класу Customer спочатку буде викликатися метод getInfo() батьківського класу User , а потім інші інструкції:

function getInfo()
{
    parent::getInfo();
    echo "Номер рахунку $this->account ; сума: $this->sum <br>";
}

Клас Customer також визначає свій конструктор:

function __construct($name, $age, $acc)
{
    // вызов конструктора базового класс
    parent::__construct($name, $age);
    $this->account = $acc;
    $this->sum = 20;
}

Тут також спочатку йде звернення до конструктора класу-батька, щоб він сам виконав установку властивостей $name і $age .


Заборона успадкування та інструкція final

В наведеному вище прикладі методи getInfo() і getClassInfo() перевизначаються класом-спадкоємцем. Однак іноді виникають ситуації, коли треба заборонити перевизначення методів. Для цього в класі-батьку треба вказати методи з модифікатором final :

class User
{
    //.........................
     
    final function getInfo()
    {
        echo "Імя: $this->name ; вік: $this->age <br />";
    }
}

В цьому випадку у всіх класах-спадкоємців від класу User ми вже не зможемо визначити метод з таким же ім'ям.


Наш партнер:
beta test mp3 playlist downloader