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.
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.
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();
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();
Czy można utworzyć klasę abstrakcyjną?
Poprawna: b) Klasa abstrakcyjna jest tylko bazą dla potomnych.
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.
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) . ' ';
}
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) . ' ';
}
Czym jest interfejs?
Poprawna: c) Interfejs wymienia metody bez implementacji.
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.
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;
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;
Do czego należy składowa statyczna?
Poprawna: d) Statyczna składowa istnieje raz dla całej klasy.