W3docs

new

Le mot-clé "new" en PHP crée de nouveaux objets à partir de classes. Découvrez sa syntaxe et son utilisation avec des exemples pratiques.

Le mot-clé PHP new

Une classe est un modèle ; un objet (ou instance) est une chose concrète construite à partir de ce modèle. Le mot-clé new est ce qui le construit — il alloue un nouvel objet, exécute le constructeur de la classe et vous renvoie une référence au résultat. Presque chaque fois que vous travaillez avec des objets en PHP, new est le point de départ.

Cette page couvre la syntaxe de new, ce qui se passe quand vous l'appelez, comment fonctionnent les arguments du constructeur, et les variations modernes que vous rencontrerez dans du vrai code (noms de classes dynamiques, new self/new static, classes anonymes, et la forme sans parenthèses ajoutée en PHP 8.4).

Syntaxe

$object = new ClassName(arguments);
  • new déclenche l'instanciation.
  • ClassName est la classe à instancier.
  • arguments sont passés à la méthode __construct() de la classe. Si la classe n'a pas de constructeur, ou si son constructeur ne prend aucun paramètre, vous pouvez utiliser des parenthèses vides new ClassName().

Le résultat est un handle d'objet assigné à $object. Appeler new à nouveau sur la même classe produit un objet séparé et indépendant.

Un premier exemple

<?php

class Greeter
{
  public function sayHello(): void
  {
    echo "Hello!";
  }
}

$object = new Greeter();
$object->sayHello();
// Output: Hello!

Une fois l'objet créé, vous utilisez l'opérateur -> pour appeler ses méthodes et lire ses propriétés.

Passer des arguments au constructeur

Si la classe définit une méthode __construct(), les arguments que vous placez dans les parenthèses après new lui sont transmis. C'est ainsi que vous donnez à chaque objet son propre état initial :

<?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 et $bob sont deux objets distincts de la même classe, chacun contenant son propre $name. Pour en savoir plus, consultez PHP Constructor.

« Essayez vous-même » n'est pas disponible pour cet exemple.

Créer un objet à partir d'un nom de classe variable

La classe à instancier n'a pas besoin d'être codée en dur — elle peut provenir d'une variable. C'est le fondement des factories, des systèmes de plugins et des conteneurs de dépendances :

<?php

class PdfReport {}
class CsvReport {}

$type = "Csv";
$className = $type . "Report"; // "CsvReport"

$report = new $className();
echo get_class($report);
// Output: CsvReport

new self, new static et new parent

À l'intérieur d'une classe, vous avez souvent besoin de créer une autre instance de la même classe. Deux mots-clés le permettent, et la différence est importante lorsque l'héritage entre en jeu :

  • new self — instancie toujours la classe où la ligne est écrite.
  • new static — instancie la classe réelle au moment de l'exécution (liaison statique tardive), de sorte que les sous-classes obtiennent leur propre type.
<?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`)

Si create() avait utilisé new self(), les deux appels retourneraient Animal. Voir Static Keyword pour plus d'informations sur la liaison statique tardive.

Classes anonymes

Lorsque vous avez besoin d'un objet unique et ne souhaitez pas nommer une classe, new class crée et instancie une classe anonyme en une seule expression :

<?php

$logger = new class {
  public function log(string $message): void
  {
    echo "LOG: $message";
  }
};

$logger->log("started");
// Output: LOG: started

Les classes anonymes peuvent prendre des arguments de constructeur, implémenter des interfaces et étendre d'autres classes — utiles pour des mocks rapides et des callbacks légers.

Appeler une méthode directement sur new (PHP 8.4+)

Historiquement, vous deviez encapsuler une expression new entre parenthèses pour appeler une méthode sur le nouvel objet. Depuis PHP 8.4, les parenthèses sont optionnelles :

// PHP 8.4 and later:
$name = new User("Alice")->name;

// Before PHP 8.4 you had to write:
$name = (new User("Alice"))->name;

Utilisez la forme avec parenthèses si vous devez prendre en charge PHP 8.3 ou une version antérieure.

Pièges courants

  • new retourne un objet, jamais une copie. Assigner l'objet à une autre variable copie le handle, pas l'objet. Pour obtenir un duplicata indépendant, utilisez clone.
  • Les arguments manquants génèrent une erreur. Si le constructeur déclare des paramètres obligatoires et que vous les omettez, PHP lève une ArgumentCountError.
  • Oublier les parenthèses lors d'une instanciation simple. new MyClass (sans parenthèses) n'est valide que lorsqu'aucun argument de constructeur n'est requis ; préférez new MyClass() pour plus de clarté en dehors du cas de chaînage de méthodes en 8.4.

Sujets connexes

Pratique

Pratique
Quelle est la syntaxe pour initialiser un nouvel objet en PHP ?
Quelle est la syntaxe pour initialiser un nouvel objet en PHP ?
Was this page helpful?