W budowie
Hermetyzacja danych, relacje między klasami i rozszerzanie funkcjonalności

Część 23 · Modyfikatory dostępu, enkapsulacja i dziedziczenie — kurs PHP INF.03

Część 23 kursu PHP INF.03: Enkapsulacja i ochrona stanu obiektów. Modyfikatory public, private, protected, gettery i settery, właściwości readonly, dziedziczenie klas (extends), przesłanianie metod i parent:: oraz 16 pytań quizowych.

  • 45 min
  • 15 slajdów
  • Notatki nauczyciela: N
  • Strona modułu: otwórz
Plan · 45 min

Co dziś robimy

  1. 14 minModyfikatory dostępu Ukrywanie danych to enkapsulacja: świat zewnętrzny nie zmienia właściwości bez kontroli.
  2. 13 minGettery i settery W PHP dostępne są też metody magiczne __get() i __set() , ale jawne gettery są…
  3. 13 minDziedziczenie klas Metodę z klasy bazowej można wywołać przez parent::metoda() , np.
  4. 5 minPodsumowanie bilet wyjściowy i zadanie domowe
Atom 1 z 4 · ~14 min

Modyfikatory dostępu

public oznacza dostęp z każdego miejsca, protected — z klasy i klas potomnych, a private — tylko z wnętrza tej klasy. Domyślnie właściwość jest publiczna, ale lepiej pisać to jawnie.

  • Ukrywanie danych to enkapsulacja: świat zewnętrzny nie zmienia właściwości bez kontroli.
  • Dzięki temu klasa pilnuje poprawności swoich danych.
  • Metody zwykle zostają publiczne, a właściwości prywatne lub chronione.
  • To najczęstszy układ w kodzie obiektowym.
Kod · atom 1 · ~3 min

Jak to wygląda w kodzie

class Konto {
    private $saldo = 0;

    public function wplac($kwota) {
        if ($kwota > 0) {
            $this->saldo += $kwota;
        }
    }

    public function saldo() {
        return $this->saldo;
    }
}

$k = new Konto();
$k->wplac(100);
echo $k->saldo();
Przykład na żywo · atom 1 · ~4 min

Uruchom i pokaż

class Konto {
    private $saldo = 0;

    public function wplac($kwota) {
        if ($kwota > 0) {
            $this->saldo += $kwota;
        }
    }

    public function saldo() {
        return $this->saldo;
    }
}

$k = new Konto();
$k->wplac(100);
echo $k->saldo();
Sprawdzenie · atom 1 · ~2 min

Pytanie do klasy

Co oznacza private?

Atom 2 z 4 · ~13 min

Gettery i settery

Gettery zwracają wartość właściwości, a settery ją ustawiają po sprawdzeniu poprawności. Dzięki temu można zmienić wewnętrzną reprezentację bez psucia kodu użytkowników klasy.

  • W PHP dostępne są też metody magiczne __get() i __set() , ale jawne gettery są czytelniejsze i łatwiejsze w testach.
  • Setter nie powinien bezwarunkowo przyjmować wszystkiego — sprawdza zakres, typ i sens wartości.
  • W razie błędu może zgłosić wyjątek albo pominąć zmianę.
Kod · atom 2 · ~3 min

Jak to wygląda w kodzie

class Ocena {
    private $wartosc = 1;

    public function ustaw($wartosc) {
        $wartosc = (int) $wartosc;
        if ($wartosc >= 1 && $wartosc <= 6) {
            $this->wartosc = $wartosc;
        }
    }

    public function wartosc() {
        return $this->wartosc;
    }
}
Przykład na żywo · atom 2 · ~4 min

Uruchom i pokaż

class Ocena {
    private $wartosc = 1;

    public function ustaw($wartosc) {
        $wartosc = (int) $wartosc;
        if ($wartosc >= 1 && $wartosc <= 6) {
            $this->wartosc = $wartosc;
        }
    }

    public function wartosc() {
        return $this->wartosc;
    }
}
Sprawdzenie · atom 2 · ~2 min

Pytanie do klasy

Co robi getter?

Atom 3 z 4 · ~13 min

Dziedziczenie klas

Klasa potomna rozszerza bazową słowem extends i dziedziczy jej publiczne oraz chronione składowe. Dzięki temu nie trzeba pisać wspólnego kodu drugi raz.

  • Metodę z klasy bazowej można wywołać przez parent::metoda() , np.
  • w konstruktorze potomnym.
  • Dziedziczenie opisuje relację „jest”: Nauczyciel jest Osobą .
  • Jeśli relacji nie ma, lepiej użyć kompozycji, czyli pola z obiektem innej klasy.
Kod · atom 3 · ~3 min

Jak to wygląda w kodzie

class Osoba {
    protected $imie;

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

    public function przedstaw() {
        return 'Jestem ' . $this->imie;
    }
}

class Nauczyciel extends Osoba {
    public function przedstaw() {
        return parent::przedstaw() . ' i ucze.';
    }
}

echo (new Nauczyciel('Pani Anna'))->przedstaw();
Przykład na żywo · atom 3 · ~4 min

Uruchom i pokaż

class Osoba {
    protected $imie;

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

    public function przedstaw() {
        return 'Jestem ' . $this->imie;
    }
}

class Nauczyciel extends Osoba {
    public function przedstaw() {
        return parent::przedstaw() . ' i ucze.';
    }
}

echo (new Nauczyciel('Pani Anna'))->przedstaw();
Sprawdzenie · atom 3 · ~2 min

Pytanie do klasy

Czym rozszerzamy klasę?

Zamknięcie · ~3 min

Co zabrać z lekcji

  • Ukrywanie danych to enkapsulacja: świat zewnętrzny nie zmienia właściwości bez kontroli.
  • W PHP dostępne są też metody magiczne __get() i __set() , ale jawne gettery są czytelniejsze i łatwiejsze w testach.
  • Metodę z klasy bazowej można wywołać przez parent::metoda() , np.
  • Ćwiczenia — Quiz wiedzy o enkapsulacji i dziedziczeniu (16 pytań)
Bilet wyjściowy: Jaką relację opisuje dziedziczenie?
Odpowiedź: d) Jest
Hyżyk· Część 23 · Modyfikatory dostępu, enkapsulacja i dziedziczeni moduł 1 / 1