Ce face abstract
O clasă abstract este o clasă „neterminată”: poate avea cod comun, dar și metode abstract, fără corp, pe care fiecare clasă copil este obligată să le scrie.
Diferența față de interface: clasa abstractă poate avea proprietăți și metode complete, deci împarte cod între clasele copil. O clasă poate însă extinde o singură clasă abstractă, dar poate implementa oricâte interfețe.
Exemple
Exemplul 1: Formă geometrică
<?php
abstract class Forma
{
abstract public function aria(): float;
public function descriere(): string
{
return static::class . " cu aria " . round($this->aria(), 2);
}
}
class Dreptunghi extends Forma
{
public function __construct(private float $l, private float $h)
{
}
public function aria(): float
{
return $this->l * $this->h;
}
}
class Cerc extends Forma
{
public function __construct(private float $raza)
{
}
public function aria(): float
{
return M_PI * $this->raza ** 2;
}
}
echo (new Dreptunghi(4, 2.5))->descriere() . "\n";
echo (new Cerc(1))->descriere();
Rezultat
Dreptunghi cu aria 10
Cerc cu aria 3.14
Exemplul 2: O clasă abstractă nu poate fi creată cu new
<?php
abstract class Raport
{
}
try {
new Raport();
} catch (Error $e) {
echo $e->getMessage();
}
Rezultat
Cannot instantiate abstract class Raport
Greșeli frecvente
- Scrii corp la o metodă abstractă:
abstract public function aria() { ... }. Metodele abstracte se termină cu;, fără acolade. - Clasa copil nu implementează toate metodele abstracte. PHP oprește scriptul, cu excepția cazului în care și clasa copil este declarată
abstract.
Comenzi înrudite
interface / implements: O interfață este o listă de metode pe care o clasă promite să le aibă. Clasa le scrie cu implements.extends / parent::: Creează o clasă nouă pornind de la una existentă (moștenire). Clasa copil primește tot ce are părintele.class / new / $this: Definește o clasă: un șablon pentru obiecte care au date (proprietăți) și funcții proprii (metode).