abstract în PHP

O clasă abstractă nu poate fi instanțiată direct. Servește drept bază pentru alte clase și poate cere metode obligatorii.

Sintaxă
abstract class Nume { abstract public function metoda(): tip; }

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).