Interfejsy w PHP

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

W PHP istnieje możliwość dziedziczenie jedynie po jednej klasie (nie ważne czy abstrakcyjnej czy nie). Z tego też względu wprowadzono możliwość tworzenia interfejsów, które mają na celu wymuszenie na każdej klasie z nimi związanej obsługę danego zestawu metod. Jedna klasa może dziedziczyć wiele interfejsów. Interfejsy tworzy się wykorzystując słowo kluczowe interface, natomiast dołącza się je do danej klasy za pomocą słowa kluczowego implements. Oto przykład interfejsu i klas z niego korzystających:

Listing 1
  1. <?php
  2. interface iArea{ // interfejs wymuszający na obiektach go implementujących obsługę metod w nim zadeklarowanych
  3. public function getTop();
  4. public function getBottom();
  5. public function getLeft();
  6. public function getRight();
  7. }
  8. // Tworzenie klasy abstrakcyjnej figura
  9. abstract class Figure implements iArea{ // a tutaj implementacja interfejsu w klasie abstrakcyjnej Figure
  10. private static $nrOfFigures; // ta zmienna statyczna klasy będzie przechowywała liczbę aktualnie utworzonych figur geometrycznych
  11. protected $fillColor;
  12. protected $strokeColor;
  13. public static function getNrOfFigures(){
  14. return self::$nrOfFigures;
  15. }
  16. private $figureName;
  17. public function __construct($fillColor = "#ffffff", $strokeColor = "#000000"){
  18. self::$nrOfFigures ++; // tutaj zwiększam licznik utworzonych figur o 1
  19. $this->fillColor = $fillColor;
  20. $this->strokeColor = $strokeColor;
  21. echo("<p>(Dodawanie) Aktualna liczba utworzonych figur geometrycznych: " . self::$nrOfFigures . "</p>");
  22. }
  23. public function __destruct(){
  24. self::$nrOfFigures --; // tutaj zminiejszam licznik utworzonych figur o 1
  25. echo("<p>(Usuwanie) Aktualna liczba utworzonych figur geometrycznych: " . self::$nrOfFigures . "</p>");
  26. }
  27. public function setFillColor($fillColor){
  28. $this->fillColor = $fillColor;
  29. }
  30. public function setStrokeColor($strokeColor){
  31. $this->strokeColor = $strokeColor;
  32. }
  33. public function getFillColor(){
  34. return $this->fillColor;
  35. }
  36. public function getStrokeColor(){
  37. return $this->strokeColor;
  38. }
  39. abstract public function draw(); // metoda abstrakcyjna rysuj
  40. abstract public function area(); // metoda abstrakcyjna pole powierzchni
  41. abstract public function circuit(); // metoda abstrakcyjna obwód
  42. }
  43. class Circle extends Figure{
  44. protected $xc,
  45. $yc,
  46. $ray;
  47. public function __construct($xc, $yc, $ray, $name = "", $fillColor = "#ffffff", $strokeColor = "#000000"){
  48. parent::__construct($fillColor, $strokeColor);
  49. $this->name = $name;
  50. $this->xc = $xc;
  51. $this->yc = $yc;
  52. $this->ray = $ray;
  53. }
  54. // obsługa metod interfejsu iArea
  55. public function getTop(){
  56. return $this->yc - $this->ray;
  57. }
  58. public function getBottom(){
  59. return $this->yc + $this->ray;
  60. }
  61. public function getLeft(){
  62. return $this->xc - $this->ray;
  63. }
  64. public function getRight(){
  65. return $this->yc + $this->ray;
  66. }
  67. public function draw(){
  68. echo("<p>Koło: xc = " . $this->xc . "; yc = " . $this->yc . "; promień = " . $this->ray . "</p>");
  69. }
  70. public function area(){
  71. return pi() * $this->ray * $this->ray;
  72. }
  73. public function circuit(){
  74. return pi() * 2 * $this->ray;
  75. }
  76. }
  77. class Rectangle extends Figure{
  78. protected $x,
  79. $y,
  80. $width,
  81. $height;
  82. public function __construct($x, $y, $width, $height, $name = "", $fillColor = "#ffffff", $strokeColor = "#000000"){
  83. parent::__construct($fillColor, $strokeColor);
  84. $this->name = $name;
  85. $this->x = $x;
  86. $this->y = $y;
  87. $this->width = $width;
  88. $this->height = $height;
  89. }
  90. // obsługa metod interfejsu iArea
  91. public function getTop(){
  92. if($this->height > 0){
  93. return $this->y;
  94. }
  95. return $this->y + $this->height;
  96. }
  97. public function getBottom(){
  98. if($this->height > 0){
  99. return $this->y + $this->height;
  100. }
  101. return $this->y;
  102. }
  103. public function getLeft(){
  104. if($this->width > 0){
  105. return $this->x;
  106. }
  107. return $this->x + $this->width;
  108. }
  109. public function getRight(){
  110. if($this->width > 0){
  111. return $this->x + $this->width;
  112. }
  113. return $this->x;
  114. }
  115. public function draw(){
  116. echo("<p>Koło: x = " . $this->x . "; y = " . $this->y . "; szerokość = " . $this->width . "; wysokość = " . $this->height . "</p>");
  117. }
  118. public function area(){
  119. return pi() * $this->ray * $this->ray;
  120. }
  121. public function circuit(){
  122. return pi() * 2 * $this->ray;
  123. }
  124. }
  125. ?>

Komentarze