extends / parent:: în PHP

Clase și obiecte PHP 4+ (final: PHP 5+)

Creează o clasă nouă pornind de la una existentă (moștenire). Clasa copil primește tot ce are părintele.

Sintaxă
class Copil extends Parinte { ... parent::metoda(); }

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ște trait, 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ță.