Klasa abstrakcyjna to klasa, której obiekty nie mogą być tworzone za pomocą operatora new, czyli nie można tworzyć ich instancji: $obiekt = new Obiekt()
Klasa abstrakcyjna – nadrzędna – stanowi pewien wzorzec dla klas potomnych, które dziedziczą jej mechanizmy tworząc elastyczniejsze podejście do pisania programów.
Klasę abstrakcyjną deklarujemy modyfikatorem abstract:
1 2 3 |
abstract class AbstractClassName { // ... } |
Implementacja klasy abstrakcyjnej w klasie potomnej:
1 2 3 |
class ClassName extends AbstractClassName { // ... } |
Klasa abstrakcyjna posiada w swoim organiźmie puste deklaracje metod abstrakcyjnych, ale może mieć również zwykłe funkcje oraz właściwości: zmienne i stałe.
Jeśli co najmniej jedna metoda w klasie zostanie zadeklarowana jako abstrakcyjna, to ta klasa musi zostać zadeklarowana jako abstrakcyjna.
Przykład:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php /* Vehicle.php */ abstract class Vehicle { public $engine; // zwykła zmienna // deklaracje metod abstrakcyjnych abstract public function brand($name); abstract public function model($name); // zwykła funkcja public function color($color) { return $color; } } |
Klasa Vehicle stanowi pewną abstrakcję. Pojazd to pojęcie ogólne; nie możemy wyobrazić go sobie jednoznacznie. Może to być samochód, motocykl, autobus itd. Aczkolwiek każdy z tych obiektów może posiadać pewne cechy wspólne np: marka, model, kolor, moc silnika, które mogą być implementowane przez klasy potomne np: Truck (samochód ciężarowy).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?php /* Truck.php */ include_once 'Vehicle.php'; class Truck extends Vehicle { public function brand($name) { return strtoupper($name); } public function model($name) { return $name; } public function engine($power) { $this->engine = $power; return $this->engine; } } $truck = new Truck(); $power = 180; echo 'Brand: '.$truck->brand('Mercedes').'<br />'; echo 'Model: '.$truck->model('Atego 1218 L 4X2').'<br />'; echo 'Engine: '.$truck->engine($power).' KM<br />'; echo 'Color: '.$truck->color('white').'<br />'; |
Wszystkie funkcje abstrakcyjne z klasy abstrakcyjnej muszą być zaimplementowane w klasach potomnych, które po niej dziedziczą (extends). Pozostałe zmienne i funkcje zwykłe mogą lub nie muszą być implementowane w klasach potomnych. Jak widać, funkcje abstrakcyjne w klasie Truck mają konkretną postać, tj. sygnatura musi być zachowana zgodnie z deklaracjami w klasie abstrakcyjnej np: brand($name), natomiast zawartość poszczególnych funkcji jest dowolna i każda klasa potomna może inaczej obrabiać te dane. Oczywiście klasa potomna może posiadać własne funkcje np: engine($power).
PODSUMOWANIE
- klasa abstrakcyjna to klasa, której obiekty nie mogą być tworzone,
- klasę abstrakcyjną deklarujemy za pomocą modyfikatora abstract,
- klasa abstrakcyjna może posiadać puste metody abstrakcyjne (bez zawartości), zwykłe funkcje oraz zmienne i stałe,
- wszystkie metody abstrakcyjne z klasy abstrakcyjnej muszą być zaimplementowane w klasach, które po niej dziedziczą.