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);newdéclenche l'instanciation.ClassNameest la classe à instancier.argumentssont 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 videsnew 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.
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: CsvReportnew 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: startedLes 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
newretourne 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éreznew MyClass()pour plus de clarté en dehors du cas de chaînage de méthodes en 8.4.
Sujets connexes
- PHP Classes and Objects — les fondations sur lesquelles
news'appuie. - PHP Constructor — comment les arguments passés à
newsont reçus. - clone — dupliquer un objet déjà créé.
- Static Keyword —
new staticet la liaison statique tardive.