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