Ce face new (și new fără paranteze în PHP 8.4)
new creează un obiect dintr-o clasă și apelează constructorul __construct cu argumentele date. Rezultatul se pune de obicei într-o variabilă.
Până la PHP 8.4, ca să apelezi o metodă direct pe obiectul abia creat, trebuia să pui expresia între paranteze: (new Factura(100))->total(). Din PHP 8.4 parantezele în plus nu mai sunt necesare: new Factura(100)->total(). Merge și pentru proprietăți, constante și metode statice.
Parantezele de după numele clasei rămân obligatorii în acest caz: new Factura->total() este eroare de sintaxă.
Parametri
| Parametru | Descriere |
|---|---|
NumeClasa |
Clasa din care se creează obiectul. Poate fi și un șir sau o variabilă care conține numele clasei. |
argumente |
Valorile trimise constructorului __construct. |
Ce returnează
Obiectul nou creat.
Exemple
Exemplul 1: Creare obiect și apel direct de metodă
<?php
class Factura
{
public function __construct(private float $suma)
{
}
public function cuTva(): float
{
return round($this->suma * 1.21, 2);
}
}
$f = new Factura(250);
echo $f->cuTva() . "\n";
// PHP 8.4+: fără paranteze în jurul lui new
echo new Factura(100)->cuTva();
Rezultat
302.5
121
Exemplul 2: Lanț de metode pe un obiect nou
<?php
class Mesaj
{
private array $randuri = [];
public function adauga(string $text): static
{
$this->randuri[] = $text;
return $this;
}
public function text(): string
{
return implode("\n", $this->randuri);
}
}
echo new Mesaj()->adauga("Bună, Ana!")->adauga("Comanda ta a plecat din Iași.")->text();
Rezultat
Bună, Ana!
Comanda ta a plecat din Iași.
Exemplul 3: Fără parantezele de după numele clasei
<?php
class Mesaj
{
public string $text = "salut";
}
echo new Mesaj->text;
Eroare afișată de PHP (codul nu rulează)
PHP Parse error: syntax error, unexpected token "->", expecting "," or ";" in exemplu.php on line 7
Greșeli frecvente
- Scrii
new Clasa->metoda(). Fără paranteze după numele clasei, PHP nu acceptă apelul direct. - Folosești
new Clasa()->metoda()pe un server cu PHP 8.3 sau mai vechi: primești eroare de sintaxă. Acolo scrie(new Clasa())->metoda(). - Crezi că
$b = $a;creează un obiect nou. Copiază doar referința; pentru o copie foloseșteclone.
Comenzi înrudite
__construct: Constructorul este metoda rulată automat la new. Pregătește obiectul cu datele de pornire.clone: Creează o copie a unui obiect. Fără clone, atribuirea unui obiect copiază doar referința către același obiect.static / self::: Membrii static aparțin clasei, nu unui obiect anume. Se apelează cu NumeClasa::metoda(), fără new.