Ce face extends / parent::
Cu extends, clasa copil moștenește proprietățile și metodele publice și protejate ale clasei părinte. Poate adăuga metode noi sau poate suprascrie metodele părintelui, scriind o metodă cu același nume.
În metoda suprascrisă, parent::metoda() apelează varianta din clasa părinte. Așa extinzi comportamentul în loc să îl rescrii de la zero.
O clasă poate extinde o singură clasă. O clasă marcată final nu mai poate fi extinsă, iar o metodă final nu poate fi suprascrisă.
Exemple
Exemplul 1: Moștenire și suprascriere
<?php
class Animal
{
public function __construct(protected string $nume)
{
}
public function prezentare(): string
{
return "Sunt $this->nume.";
}
}
class Caine extends Animal
{
public function prezentare(): string
{
return parent::prezentare() . " Fac ham!";
}
}
echo (new Animal("o pisică"))->prezentare() . "\n";
echo (new Caine("Rex"))->prezentare();
Rezultat
Sunt o pisică.
Sunt Rex. Fac ham!
Exemplul 2: Constructor în clasa copil
Clasa copil adaugă o proprietate nouă și trimite restul datelor constructorului părinte.
<?php
class Produs
{
public function __construct(public string $nume, public float $pret)
{
}
}
class ProdusRedus extends Produs
{
public function __construct(string $nume, float $pret, public int $reducere)
{
parent::__construct($nume, $pret * (100 - $reducere) / 100);
}
}
$p = new ProdusRedus("Căști", 200, 25);
echo "$p->nume: $p->pret lei (reducere $p->reducere%)";
Rezultat
Căști: 150 lei (reducere 25%)
Exemplul 3: O clasă copil este și de tipul părintelui
<?php
class Vehicul {}
class Masina extends Vehicul {}
$m = new Masina();
var_dump($m instanceof Masina);
var_dump($m instanceof Vehicul);
echo get_parent_class($m);
Rezultat
bool(true)
bool(true)
Vehicul
Greșeli frecvente
- Încerci să extinzi două clase:
class C extends A, B. PHP nu permite. Pentru cod comun din mai multe surse foloseștetrait, iar pentru „contracte” multiple,interface. - Suprascrii o metodă cu alți parametri sau alt tip returnat, incompatibil cu părintele. PHP oprește scriptul cu eroare fatală: semnătura trebuie să fie compatibilă.
Comenzi înrudite
class / new / $this: Definește o clasă: un șablon pentru obiecte care au date (proprietăți) și funcții proprii (metode).__construct: Constructorul este metoda rulată automat la new. Pregătește obiectul cu datele de pornire.abstract: O clasă abstractă nu poate fi instanțiată direct. Servește drept bază pentru alte clase și poate cere metode obligatorii.interface / implements: O interfață este o listă de metode pe care o clasă promite să le aibă. Clasa le scrie cu implements.trait / use: Un trait este un bloc de metode și proprietăți pe care îl poți copia în mai multe clase cu use.instanceof: Verifică dacă un obiect este de o anumită clasă, extinde acea clasă sau implementează o interfață.