__construct în PHP

Clase și obiecte PHP 5+ (promovarea în constructor: PHP 8.0+)

Constructorul este metoda rulată automat la new. Pregătește obiectul cu datele de pornire.

Sintaxă
public function __construct(tip $parametru) { ... }

Ce face __construct

Metoda __construct rulează automat când creezi un obiect cu new. Valorile date în paranteze la new Produs("Mouse", 80) ajung ca parametri ai constructorului.

Din PHP 8 există promovarea în constructor: dacă pui vizibilitatea (public, private…) în fața parametrului, PHP creează proprietatea și îi atribuie valoarea automat. Codul devine mult mai scurt.

O clasă copil care are propriul constructor trebuie să apeleze explicit constructorul părintelui cu parent::__construct(...).

Exemple

Exemplul 1: Constructor clasic

<?php
class Produs
{
    public string $nume;
    public float $pret;

    public function __construct(string $nume, float $pret)
    {
        $this->nume = $nume;
        $this->pret = $pret;
    }
}

$p = new Produs("Tastatură", 150);
echo "$p->nume: $p->pret lei";

Rezultat

Tastatură: 150 lei

Exemplul 2: Promovarea în constructor (PHP 8+)

Același rezultat, cu mai puțin cod. Parametrul cu valoare implicită poate lipsi la new.

<?php
class Produs
{
    public function __construct(
        public string $nume,
        public float $pret,
        public int $stoc = 0,
    ) {
    }
}

$p = new Produs("Monitor", 900);
echo "$p->nume: $p->pret lei, stoc $p->stoc";

Rezultat

Monitor: 900 lei, stoc 0

Exemplul 3: Validare în constructor

Dacă datele sunt greșite, constructorul aruncă o excepție și obiectul nu mai este creat.

<?php
class Email
{
    public function __construct(public readonly string $adresa)
    {
        if (!filter_var($adresa, FILTER_VALIDATE_EMAIL)) {
            throw new InvalidArgumentException("Adresă invalidă: $adresa");
        }
    }
}

echo (new Email("ana@exemplu.ro"))->adresa . "\n";

try {
    new Email("ana-exemplu.ro");
} catch (InvalidArgumentException $e) {
    echo $e->getMessage();
}

Rezultat

ana@exemplu.ro
Adresă invalidă: ana-exemplu.ro

Greșeli frecvente

  • Scrii _construct cu o singură linie jos. Metoda nu mai este constructor, deci nu rulează la new. Corect: două linii jos, __construct.
  • Folosești promovarea și scrii și $this->nume = $nume; în corpul constructorului. Nu este greșit, dar este inutil: promovarea face deja atribuirea.
  • În clasa copil uiți parent::__construct(...). Proprietățile pregătite de părinte rămân neinițializate.

Comenzi înrudite

  • class / new / $this: Definește o clasă: un șablon pentru obiecte care au date (proprietăți) și funcții proprii (metode).
  • extends / parent::: Creează o clasă nouă pornind de la una existentă (moștenire). Clasa copil primește tot ce are părintele.
  • readonly: O proprietate readonly poate primi valoare o singură dată, apoi nu mai poate fi modificată.
  • __get / __set / __toString / __call / __invoke: Metode cu nume speciale, care încep cu două linii jos, rulate automat de PHP în anumite situații.