new (și new fără paranteze în PHP 8.4) în PHP

Clase și obiecte PHP 5+ (apel de metodă direct pe new fără paranteze: PHP 8.4+)

Creează un obiect nou dintr-o clasă. Din PHP 8.4 poți apela o metodă direct pe new Clasa(), fără paranteze în plus.

Sintaxă
$obiect = new NumeClasa(argumente);
new NumeClasa()->metoda();   // PHP 8.4+

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ște clone.

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.