new
La parola chiave "new" in PHP crea nuovi oggetti dalle classi. Scopri sintassi, argomenti del costruttore e varianti moderne come classi anonime e new static.
La parola chiave new in PHP
Una classe è un modello; un oggetto (o istanza) è una cosa concreta costruita da quel modello. La parola chiave new è ciò che lo costruisce — alloca un nuovo oggetto, esegue il costruttore della classe e restituisce un riferimento al risultato. Quasi ogni volta che lavori con gli oggetti in PHP, new è il punto di partenza.
Questa pagina tratta la sintassi di new, cosa succede quando lo chiami, come funzionano gli argomenti del costruttore e le varianti moderne che incontrerai nel codice reale (nomi di classe dinamici, new self/new static, classi anonime e la forma senza parentesi aggiunta in PHP 8.4).
Sintassi
$object = new ClassName(arguments);newavvia l'istanziazione.ClassNameè la classe da istanziare.argumentsvengono passati al metodo__construct()della classe. Se la classe non ha un costruttore, o il suo costruttore non accetta parametri, puoi usare le parentesi vuotenew ClassName().
Il risultato è un handle dell'oggetto assegnato a $object. Chiamare new di nuovo sulla stessa classe produce un oggetto separato e indipendente.
Un primo esempio
<?php
class Greeter
{
public function sayHello(): void
{
echo "Hello!";
}
}
$object = new Greeter();
$object->sayHello();
// Output: Hello!Una volta che l'oggetto esiste, si usa l'operatore -> per chiamare i suoi metodi e leggere le sue proprietà.
Passare argomenti al costruttore
Se la classe definisce un metodo __construct(), gli argomenti che metti nelle parentesi dopo new vengono inoltrati ad esso. In questo modo si dà a ogni oggetto il proprio stato iniziale:
<?php
class User
{
public function __construct(public string $name) {}
}
$alice = new User("Alice");
$bob = new User("Bob");
echo $alice->name; // Alice
echo "\n";
echo $bob->name; // Bob$alice e $bob sono due oggetti distinti della stessa classe, ognuno con il proprio $name. Scopri di più in PHP Constructor.
Creare un oggetto da un nome di classe variabile
La classe da istanziare non deve essere scritta direttamente nel codice — può provenire da una variabile. Questa è la base di factory, sistemi di plugin e container di dipendenze:
<?php
class PdfReport {}
class CsvReport {}
$type = "Csv";
$className = $type . "Report"; // "CsvReport"
$report = new $className();
echo get_class($report);
// Output: CsvReportnew self, new static e new parent
All'interno di una classe spesso è necessario creare un'altra istanza della stessa classe. Due parole chiave lo fanno, e la differenza è importante quando è coinvolta l'ereditarietà:
new self— istanzia sempre la classe in cui è scritta la riga.new static— istanzia la classe effettiva a runtime (late static binding), quindi le sottoclassi ottengono il proprio tipo.
<?php
class Animal
{
public static function create(): static
{
return new static();
}
}
class Dog extends Animal {}
echo get_class(Animal::create()); // Animal
echo "\n";
echo get_class(Dog::create()); // Dog (thanks to `new static`)Se create() avesse usato new self(), entrambe le chiamate avrebbero restituito Animal. Vedi Static Keyword per maggiori informazioni sul late static binding.
Classi anonime
Quando hai bisogno di un oggetto usa-e-getta e non vuoi dare un nome a una classe, new class crea e istanzia una classe anonima in un'unica espressione:
<?php
$logger = new class {
public function log(string $message): void
{
echo "LOG: $message";
}
};
$logger->log("started");
// Output: LOG: startedLe classi anonime possono accettare argomenti del costruttore, implementare interfacce ed estendere altre classi — utili per mock veloci e callback leggere.
Chiamare un metodo direttamente su new (PHP 8.4+)
Storicamente dovevi racchiudere un'espressione new tra parentesi per chiamare un metodo sull'oggetto appena creato. Da PHP 8.4 le parentesi sono facoltative:
// PHP 8.4 and later:
$name = new User("Alice")->name;
// Before PHP 8.4 you had to write:
$name = (new User("Alice"))->name;Usa la forma con parentesi se devi supportare PHP 8.3 o versioni precedenti.
Errori comuni
newrestituisce un oggetto, mai una copia. Assegnare l'oggetto a un'altra variabile copia l'handle, non l'oggetto. Per ottenere un duplicato indipendente, usa clone.- Argomenti mancanti generano un errore. Se il costruttore dichiara parametri obbligatori e li ometti, PHP lancia un
ArgumentCountError. - Dimenticare le parentesi su un'istanziazione semplice.
new MyClass(senza parentesi) è valido solo quando non sono richiesti argomenti al costruttore; preferiscinew MyClass()per chiarezza al di fuori del caso di method chaining in 8.4.
Argomenti correlati
- PHP Classes and Objects — le fondamenta su cui si basa
new. - PHP Constructor — come vengono ricevuti gli argomenti passati a
new. - clone — duplicare un oggetto già creato.
- Static Keyword —
new statice late static binding.