PHPDevs

Projekt obiektowy z Composerem i Twigiem? Czytaj!

Programowanie obiektowe > Lekcja 6

Dziedziczenie

Przed Tobą wielka rzecz w temacie programowania obiektowego - dziedziczenie. Pewnie rozumiesz samo pojęcie dziedziczenia poza programowaniem (na przykład dziecko dziedziczy kolor oczu po matce). W programowaniu mamy podobnie: tworzona klasa może dziedziczyć po innej klasie, to znaczy przejąć jej właściwości oraz metody. Rzecz jasna klasa, która dziedziczy również może mieć swoje metody czy właściwości.

A więc pozostając przy tematyce ludzi, spójrzmy na jakiś przykład. Wyobraź sobie, że mamy system obsługujący przychodnię lekarską i dzieci oraz osoby dorosłe muszą być inaczej potraktowane. Jest jednak sporo informacji, jakie należy zebrać na temat każdej osoby: imię i nazwisko, adres, PESEL i tak dalej. Zapiszmy to przy użyciu klasy bazowej i dwóch klas dziedziczących.

<?php

class Person
{
    public $name;

    public function __construct(string $name)
    {
        $this->name = $name;
    }

    public function getName(): string
    {
        return $this->name;
    }
}

class Adult extends Person
{
    // code for adults
}

class Child extends Person
{
    public function checkVaccinations(): bool
    {
        // code...
        return true;
    }
}

$person = new Child('Jan Kowalski');
echo $person->getName(); // result: Jan Kowalski
var_dump($person->checkVaccinations()); // result: bool(true)

Klasę, po której chcemy dziedziczyć, określamy poprzez extends. Gdybyśmy dziedziczenia nie znali, to musielibyśmy skopiować część funkcji z jednej klasy do drugiej, co rodziłoby tylko problemy - w przypadku zmiany lub problemów trzeba byłoby szukać w kilku miejscach.

Nadpisywanie elementów

Ktoś pewnie zastanowi się teraz co stanie się, gdy utworzy w klasie metodę lub właściwość o takiej samej nazwie, jaka już istnieje w klasie, po której dziedziczy. Śpieszę z wyjaśnieniem, że element z klasy bazowej zostanie nadpisany. Innymi słowy mówiąc, właściwość będzie miała taką wartość lub jak w klasie, która dziedziczy, a metoda będzie robiła to co ta zapisana w klasie, która dziedziczy. Może trochę zawile to brzmi, ale chyba rozumiesz działanie. Jeśli nie to poniższy przykład na pewno wszystko rozjaśni:

<?php
    
class Person
{
    public $name = 'Jan';
}

class Child extends Person
{
    public $name = 'Marek';
}

$person = new Child();
echo $person->name; // result: Marek

Jeżeli jednak zaistnieje potrzeba wywołania nadpisanej metody z klasy bazowej to jest taka możliwość. Wystarczy wywołać metodę z dopiskiem parent::.

<?php

class Person
{
    public function checkVaccinations()
    {
        // code...
        echo 'Check person!';
    }
}
    
class Child extends Person
{
    public function checkVaccinations()
    {
        parent::checkVaccinations();
        echo 'Check child!';
    }
}

$person = new Child();
$person->checkVaccinations(); // result: Check person!Check child!

Mam nadzieję, że udało Ci się zrozumieć dziedziczenie, bo to bardzo przydatna sprawa. Wykorzystywane jest ono w naprawdę wielu miejscach, a przykłady wyobrazić sobie chyba nietrudno. Momentami problematyczne może wydawać się to, że nie widzisz w jednym miejscu jakie metody ma dana klasa. Dlatego właśnie warto programować w IDE, które wszystko analizuje i podpowiada :)

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter
  • Google+

Komentarze