Klasy abstrakcyjne w OOP w PHP
Załóżmy, że masz klasę User, a od
niej dziedziczą klasy Employee i
Student.
Przy tym zakłada się, że będziesz tworzyć
obiekty klas Employee i Student,
ale obiektów klasy User - nie będziesz,
ponieważ ta klasa jest używana tylko do
grupowania wspólnych właściwości i metod swoich
potomków.
W tym przypadku można wymusić zakaz
tworzenia obiektów klasy User, aby
ty lub inny programista gdzieś ich przypadkowo
nie utworzyli.
Do tego służą tak zwane klasy abstrakcyjne. Klasy abstrakcyjne reprezentują klasy przeznaczone do dziedziczenia od nich. Przy tym obiektów takich klas nie można utworzyć.
Aby zadeklarować klasę jako abstrakcyjną,
należy przy jej deklaracji napisać słowo kluczowe
abstract:
<?php
abstract class User
{
}
?>
A więc, napiszmy implementację klasy abstrakcyjnej
User. Niech ma ona prywatną
właściwość name, a także gettery i settery
dla niej:
<?php
abstract class User
{
private $name;
public function getName()
{
return $this->name;
}
public function setName($name)
{
$this->name = $name;
}
}
?>
Próba utworzenia obiektu klasy User
spowoduje błąd:
<?php
$user = new User; // zwróci błąd
?>
Ale dziedziczenie od naszej klasy będzie
możliwe. Stwórzmy klasę Employee, która
będzie dziedziczyć po naszej klasie abstrakcyjnej
User:
<?php
class Employee extends User
{
private $salary;
public function getSalary()
{
return $this->salary;
}
public function setSalary($salary)
{
$this->salary = $salary;
}
}
?>
Stwórzmy obiekt klasy Employee -
wszystko będzie działać:
<?php
$employee = new Employee;
$employee->setName('john'); // metoda rodzica, tj. klasy User
$employee->setSalary(1000); // własna metoda, tj. klasy Employee
echo $employee->getName(); // wypisze 'john'
echo $employee->getSalary(); // wypisze 1000
?>
Stwórz klasę abstrakcyjną Figure,
reprezentującą figurę geometryczną.
Niech po niej dziedziczą klasy
dla koła, prostokąta i kwadratu.