Klasy i metody abstrakcyjne w PHP

Stronę tą wyświetlono już: 221 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):

Listing 1
  1. <?php
  2. // Tworzenie klasy abstrakcyjnej figura
  3. abstract class Figure{
  4. private static $nrOfFigures; // ta zmienna statyczna klasy będzie przechowywała liczbę aktualnie utworzonych figór geometrycznych
  5. public static function getNrOfFigures(){
  6. return self::$nrOfFigures;
  7. }
  8. private $figureName;
  9. public function __construct(){
  10. self::$nrOfFigures ++; // tutaj zwiększam licznik utworzonych figur o 1
  11. echo("<p>(Dodawanie) Aktualna liczba utworzonych figur geometrycznych: " . self::$nrOfFigures . "</p>");
  12. }
  13. public function __destruct(){
  14. self::$nrOfFigures --; // tutaj zminiejszam licznik utworzonych figur o 1
  15. echo("<p>(Usuwanie) Aktualna liczba utworzonych figur geometrycznych: " . self::$nrOfFigures . "</p>");
  16. }
  17. abstract public function draw(); // metoda abstrakcyjna rysuj
  18. abstract public function area(); // metoda abstrakcyjna pole powierzchni
  19. abstract public function circuit(); // metoda abstrakcyjna obwód
  20. }
  21. // Klasa koło, dziedzicząca po klasie abstrakcyjnej figura
  22. class Circle extends Figure{
  23. protected $xc,
  24. $yc,
  25. $ray;
  26. public function __construct($xc, $yc, $ray, $name = ""){
  27. parent::__construct();
  28. $this->name = $name;
  29. $this->xc = $xc;
  30. $this->yc = $yc;
  31. $this->ray = $ray;
  32. }
  33. public function draw(){
  34. echo("<p>Koło: xc = " . $this->xc . "; yc = " . $this->yc . "; promień = " . $this->ray . "</p>");
  35. }
  36. public function area(){
  37. return pi() * $this->ray * $this->ray;
  38. }
  39. public function circuit(){
  40. return pi() * 2 * $this->ray;
  41. }
  42. }
  43. // Klara prostokąt dziedzicząca po klasie abstrakcyjnej figura
  44. class Rectangle extends Figure{
  45. protected $x,
  46. $y,
  47. $width,
  48. $height;
  49. public function __construct($x, $y, $width, $height, $name = ""){
  50. parent::__construct();
  51. $this->name = $name;
  52. $this->x = $x;
  53. $this->y = $y;
  54. $this->width = $width;
  55. $this->height = $height;
  56. }
  57. public function draw(){
  58. echo("<p>Koło: x = " . $this->x . "; y = " . $this->y . "; szerokość = " . $this->width . "; wysokość = " . $this->height . "</p>");
  59. }
  60. public function area(){
  61. return pi() * $this->ray * $this->ray;
  62. }
  63. public function circuit(){
  64. return pi() * 2 * $this->ray;
  65. }
  66. }
  67. // tworzenie obiektów klas dziedziczących po figurze
  68. $circle1 = new Circle(10, 10, 100); // obiekt klasy koło
  69. $rectangle1 = new Rectangle(10,10, 100, 100); // obiekt klasy prostokąt
  70. $rectangle1->draw(); // "rysowanie" obiektu klasy prostokąt
  71. $circle1->draw(); // "rysowanie" obiektu klasy okrąg
  72. unset($rectangle1); // usuwanie obiektu z pamięci
  73. unset($circle1); // usuwanie obiektu z pamięci
  74. ?>

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

Komentarze