W budowie
Kontrakty interfejsów, abstrakcja, elementy współdzielone i architektura wyjątków

Część 24 · Polimorfizm, interfejsy, klasy abstrakcyjne i elementy statyczne — kurs PHP INF.03

Część 24 kursu PHP INF.03: Zaawansowane mechanizmy OOP w PHP. Klasy i metody abstrakcyjne, interfejsy (implements), polimorfizm w architekturze, składowe statyczne (static i ::), stałe klasowe oraz obsługa wyjątków obiektowych (try-catch, Exception) z 16 pytaniami quizowymi.

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

Co dziś robimy

  1. 14 minKlasy abstrakcyjne Klasa potomna musi zaimplementować wszystkie metody abstrakcyjne.
  2. 13 minInterfejsy i polimorfizm Polimorfizm polega na tym, że różne klasy mają metody o tej samej nazwie i można je…
  3. 13 minSkładowe statyczne i stałe klasowe static przydaje się do liczników i funkcji pomocniczych, które nie potrzebują danych…
  4. 5 minPodsumowanie bilet wyjściowy i zadanie domowe
Atom 1 z 4 · ~14 min

Klasy abstrakcyjne

Klasy abstrakcyjnej nie można utworzyć przez new — służy jako wspólna baza. Może zawierać zwykłe metody oraz metody abstrakcyjne, czyli same nagłówki bez treści.

  • Klasa potomna musi zaimplementować wszystkie metody abstrakcyjne.
  • To wymusza spójny interfejs: każda figura ma na przykład metodę pole() .
  • Klasa abstrakcyjna różni się od interfejsu tym, że może mieć działający kod i właściwości.
  • Interfejs opisuje wyłącznie zestaw metod.
Kod · atom 1 · ~3 min

Jak to wygląda w kodzie

abstract class Figura {
    abstract public function pole();

    public function opis() {
        return 'Pole figury: ' . round($this->pole(), 2);
    }
}

class Kwadrat extends Figura {
    public function __construct(private float $bok) {}

    public function pole() {
        return $this->bok ** 2;
    }
}

echo (new Kwadrat(3))->opis();
Przykład na żywo · atom 1 · ~4 min

Uruchom i pokaż

abstract class Figura {
    abstract public function pole();

    public function opis() {
        return 'Pole figury: ' . round($this->pole(), 2);
    }
}

class Kwadrat extends Figura {
    public function __construct(private float $bok) {}

    public function pole() {
        return $this->bok ** 2;
    }
}

echo (new Kwadrat(3))->opis();
Sprawdzenie · atom 1 · ~2 min

Pytanie do klasy

Czy można utworzyć klasę abstrakcyjną?

Atom 2 z 4 · ~13 min

Interfejsy i polimorfizm

Interfejs deklaruje metody bez implementacji, a klasa przyjmuje go słowem implements . Jedna klasa może implementować kilka interfejsów, bo w PHP dziedziczyć można tylko po jednej klasie.

  • Polimorfizm polega na tym, że różne klasy mają metody o tej samej nazwie i można je wywoływać w ten sam sposób.
  • Pętla po figury może liczyć pole niezależnie od konkretnej klasy.
  • Interfejs jest umową: kod, który go używa, nie musi znać szczegółów implementacji.
  • Wystarczy, że obiekt ma wymagane metody.
Kod · atom 2 · ~3 min

Jak to wygląda w kodzie

interface Figura {
    public function pole(): float;
}

class Kolo implements Figura {
    public function __construct(private float $r) {}
    public function pole(): float { return pi() * $this->r ** 2; }
}

class Prostokat implements Figura {
    public function __construct(private float $a, private float $b) {}
    public function pole(): float { return $this->a * $this->b; }
}

foreach ([new Kolo(1), new Prostokat(2, 3)] as $f) {
    echo round($f->pole(), 2) . ' ';
}
Przykład na żywo · atom 2 · ~4 min

Uruchom i pokaż

interface Figura {
    public function pole(): float;
}

class Kolo implements Figura {
    public function __construct(private float $r) {}
    public function pole(): float { return pi() * $this->r ** 2; }
}

class Prostokat implements Figura {
    public function __construct(private float $a, private float $b) {}
    public function pole(): float { return $this->a * $this->b; }
}

foreach ([new Kolo(1), new Prostokat(2, 3)] as $f) {
    echo round($f->pole(), 2) . ' ';
}
Sprawdzenie · atom 2 · ~2 min

Pytanie do klasy

Czym jest interfejs?

Atom 3 z 4 · ~13 min

Składowe statyczne i stałe klasowe

Składowa statyczna należy do klasy, a nie do obiektu — istnieje w jednym egzemplarzu. Wywołujemy ją przez self:: wewnątrz klasy albo Klasa:: na zewnątrz.

  • static przydaje się do liczników i funkcji pomocniczych, które nie potrzebują danych obiektu.
  • Do obiektu odwołujemy się wtedy przez $this , a do statycznej przez self .
  • const definiuje stałą klasową — wartość niezmienną, czytaną tą samą składnią.
Kod · atom 3 · ~3 min

Jak to wygląda w kodzie

class Licznik {
    private static int $ile = 0;
    public const WERSJA = '1.0';

    public static function dodaj(): void {
        self::$ile++;
    }

    public static function wartosc(): int {
        return self::$ile;
    }
}

Licznik::dodaj();
Licznik::dodaj();
echo Licznik::wartosc() . ' / ' . Licznik::WERSJA;
Przykład na żywo · atom 3 · ~4 min

Uruchom i pokaż

class Licznik {
    private static int $ile = 0;
    public const WERSJA = '1.0';

    public static function dodaj(): void {
        self::$ile++;
    }

    public static function wartosc(): int {
        return self::$ile;
    }
}

Licznik::dodaj();
Licznik::dodaj();
echo Licznik::wartosc() . ' / ' . Licznik::WERSJA;
Sprawdzenie · atom 3 · ~2 min

Pytanie do klasy

Do czego należy składowa statyczna?

Zamknięcie · ~3 min

Co zabrać z lekcji

  • Klasa potomna musi zaimplementować wszystkie metody abstrakcyjne.
  • Polimorfizm polega na tym, że różne klasy mają metody o tej samej nazwie i można je wywoływać w ten sam sposób.
  • static przydaje się do liczników i funkcji pomocniczych, które nie potrzebują danych obiektu.
  • Ćwiczenia — Quiz wiedzy o zaawansowanym OOP w PHP (16 pytań)
Bilet wyjściowy: Czym jest self?
Odpowiedź: a) Odwołaniem do klasy
Hyżyk· Część 24 · Polimorfizm, interfejsy, klasy abstrakcyjne i ele moduł 1 / 1