W3docs

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);
  • new avvia l'istanziazione.
  • ClassName è la classe da istanziare.
  • arguments vengono passati al metodo __construct() della classe. Se la classe non ha un costruttore, o il suo costruttore non accetta parametri, puoi usare le parentesi vuote new 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.

"Provalo tu stesso" non è disponibile per questo esempio.

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: CsvReport

new 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: started

Le 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

  • new restituisce 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; preferisci new MyClass() per chiarezza al di fuori del caso di method chaining in 8.4.

Argomenti correlati

Pratica

Pratica
Qual è la sintassi per inizializzare un nuovo oggetto in PHP?
Qual è la sintassi per inizializzare un nuovo oggetto in PHP?
Was this page helpful?