Clase și metode abstracte
O clasă abstractă reprezintă o implementare parțială pentru clasele derivate.
O clasă abstractă este definită cu ajutorul modificatorului abstract, care se plasează înaintea numelui clasei:
abstract class Messenger { }
Una dintre caracteristicile cheie ale claselor abstracte este că nu putem crea direct obiecte ale unei clase abstracte prin apelarea constructorului său:
abstract class Messenger { }
$telegram = new Messenger(); // această linie nu va funcționa
Clasele abstracte, la fel ca și clasele obișnuite, pot defini variabile și constante, metode și constructori.
O altă caracteristică a claselor abstracte este că ele pot conține metode abstracte. Acestea sunt metode care nu au implementare. Implementarea pentru ele este oferită de clasele derivate. De exemplu:
abstract class Messenger
{
abstract function send($message); // metodă abstractă
}
La definirea unei metode abstracte, înainte de cuvântul function se pune modificatorul abstract. Iar după lista de parametri ai metodei se pune punct și virgulă.
Metodele abstracte pot fi plasate doar în clase abstracte. O clasă obișnuită (neabstractă) nu poate avea metode abstracte.
Dacă o clasă neabstractă moștenește de la o clasă abstractă, ea este obligată să implementeze toate metodele abstracte ale acesteia.
Pentru a moșteni o clasă abstractă, la fel ca în cazul general al moștenirii, se folosește cuvântul cheie extends. De exemplu:
<?php
abstract class Messenger
{
protected $name;
function __construct($name)
{
$this->name = $name;
}
abstract function send($message);
function close()
{
echo "Ieșire din messenger...";
}
}
class EmailMessenger extends Messenger
{
function send($message)
{
echo "$this->name trimite mesajul: $message<br>";
}
}
$outlook = new EmailMessenger("Outlook");
$outlook->send("Hello PHP 8");
$outlook->close();
?>
În acest caz, clasa EmailMessenger moștenește de la clasa abstractă Messenger.
Clasa abstractă definește metoda abstractă send(), astfel încât clasa derivată EmailMessenger trebuie să ofere o implementare pentru această metodă.
Astfel, în acest caz, vom obține următorul rezultat:
Outlook trimite mesajul: Hello PHP 8
Ieșire din messenger...
Putem observa că clasele abstracte sunt similare cu interfețele - ambele pot defini metode fără implementare, care sunt implementate în alte clase. Totuși, clasele abstracte, la fel ca și clasele obișnuite, pot avea variabile, metode neabstracte, constructori cu implementare, pe când interfețele nu pot.
În plus, în PHP, o clasă poate moșteni doar de la o singură clasă, în timp ce o clasă poate implementa mai multe interfețe simultan.