Klasy i metody abstrakcyjne w PHP

Autor podstrony: Krzysztof Zajączkowski

Stronę tą wyświetlono już: 8298 razy

Tworzenie obiektów niektórych klas nie ma większego sensu, np. tworząc klasę figura nie deklaruje się jej z myślą o tworzeniu jej obiektów, a jedynie z myślą wykorzystania jej do zaimplementowania wspólnych elementów dla wszystkich obiektów będących figurami geometrycznymi. Tak więc przykładowo klasa okrąg będzie dziedziczyła po klasie figura. A jakie są cechy wspólne dla wszystkich figur geometrycznych? Np. pole powierzchni, obwód. Niektóre obiekty będą miały własne cechy szczególne jaką w przypadku koła jest promień i średnica. Każda figura powinna mieć zaimplementowaną metodę rysującą, która powinna być zadeklarowana właśnie w klasie figura.

Deklaracje klas, których obiektów nie powinno się tworzyć w PHP wprowadzono słowo kluczowe abstract. Klasa figura będzie więc klasą abstrakcyjną. Oto przykładowa implementacja takiej klasy (z użyciem angielskiego nazewnictwa):

<?php // Tworzenie klasy abstrakcyjnej figura abstract class Figure{ private static $nrOfFigures; // ta zmienna statyczna klasy będzie przechowywała liczbę aktualnie utworzonych figór geometrycznych public static function getNrOfFigures(){ return self::$nrOfFigures; } private $figureName; public function __construct(){ self::$nrOfFigures ++; // tutaj zwiększam licznik utworzonych figur o 1 echo("<p>(Dodawanie) Aktualna liczba utworzonych figur geometrycznych: " . self::$nrOfFigures . "</p>"); } public function __destruct(){ self::$nrOfFigures --; // tutaj zminiejszam licznik utworzonych figur o 1 echo("<p>(Usuwanie) Aktualna liczba utworzonych figur geometrycznych: " . self::$nrOfFigures . "</p>"); } abstract public function draw(); // metoda abstrakcyjna rysuj abstract public function area(); // metoda abstrakcyjna pole powierzchni abstract public function circuit(); // metoda abstrakcyjna obwód } // Klasa koło, dziedzicząca po klasie abstrakcyjnej figura class Circle extends Figure{ protected $xc, $yc, $ray; public function __construct($xc, $yc, $ray, $name = ""){ parent::__construct(); $this->name = $name; $this->xc = $xc; $this->yc = $yc; $this->ray = $ray; } public function draw(){ echo("<p>Koło: xc = " . $this->xc . "; yc = " . $this->yc . "; promień = " . $this->ray . "</p>"); } public function area(){ return pi() * $this->ray * $this->ray; } public function circuit(){ return pi() * 2 * $this->ray; } } // Klara prostokąt dziedzicząca po klasie abstrakcyjnej figura class Rectangle extends Figure{ protected $x, $y, $width, $height; public function __construct($x, $y, $width, $height, $name = ""){ parent::__construct(); $this->name = $name; $this->x = $x; $this->y = $y; $this->width = $width; $this->height = $height; } public function draw(){ echo("<p>Koło: x = " . $this->x . "; y = " . $this->y . "; szerokość = " . $this->width . "; wysokość = " . $this->height . "</p>"); } public function area(){ return pi() * $this->ray * $this->ray; } public function circuit(){ return pi() * 2 * $this->ray; } } // tworzenie obiektów klas dziedziczących po figurze $circle1 = new Circle(10, 10, 100); // obiekt klasy koło $rectangle1 = new Rectangle(10,10, 100, 100); // obiekt klasy prostokąt $rectangle1->draw(); // "rysowanie" obiektu klasy prostokąt $circle1->draw(); // "rysowanie" obiektu klasy okrąg unset($rectangle1); // usuwanie obiektu z pamięci unset($circle1); // usuwanie obiektu z pamięci ?>

W powyższym kodzie klasa Figure ma metody abstrakcyjne, które muszą być obsłużone przez każdą klasę po niej dziedziczącą. Dzięki temu programista ma pewność, że dany zestaw klas będzie poprawnie obsługiwał wszystkie metody wspólne dla danego zbioru klas (którym w tym przypadku jest figura). Dodatkowo klasa Figure w konstruktorze i destruktorze zlicza ile jest aktualnie utworzonych obiektów będących figurami geometrycznymi.

Wynik działania powyższego kodu:

(Dodawanie) Aktualna liczba utworzonych figur geometrycznych: 1

(Dodawanie) Aktualna liczba utworzonych fugur geometrycznych: 2

Koło: x = 10; y = 10; szerokość = 100; wysokość = 100

Koło: xc = 10; yc = 10; promień = 100

(Usuwanie) Aktualna liczba utworzonych figur geometrycznych: 1

(Usuwanie) Aktualna liczba utworzonych fugur geometrycznych: 0

Propozycje książek