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
_constructcu o singură linie jos. Metoda nu mai este constructor, deci nu rulează lanew. 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.