new
A palavra-chave "new" em PHP cria novos objetos a partir de classes. Explore a sintaxe e o uso de "new" com exemplos práticos.
A Palavra-chave new do PHP
Uma classe é um molde; um objeto (ou instância) é algo concreto construído a partir desse molde. A palavra-chave new é o que o constrói — ela aloca um novo objeto, executa o construtor da classe e retorna uma referência para o resultado. Quase sempre que você trabalha com objetos em PHP, new é o ponto de partida.
Esta página aborda a sintaxe de new, o que acontece quando você a chama, como funcionam os argumentos do construtor e as variações modernas que você encontrará em código real (nomes de classes dinâmicos, new self/new static, classes anônimas e a forma sem parênteses adicionada no PHP 8.4).
Sintaxe
$object = new ClassName(arguments);newdispara a instanciação.ClassNameé a classe a ser instanciada.argumentssão passados ao método__construct()da classe. Se a classe não tiver construtor, ou se o construtor não receber parâmetros, você pode usar parênteses vaziosnew ClassName().
O resultado é um handle de objeto atribuído a $object. Chamar new novamente na mesma classe produz um objeto separado e independente.
Um primeiro exemplo
<?php
class Greeter
{
public function sayHello(): void
{
echo "Hello!";
}
}
$object = new Greeter();
$object->sayHello();
// Output: Hello!Uma vez que o objeto existe, você usa o operador -> para chamar seus métodos e acessar suas propriedades.
Passando argumentos ao construtor
Se a classe define um método __construct(), os argumentos que você coloca entre parênteses após new são encaminhados a ele. É assim que você dá a cada objeto seu estado inicial:
<?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 são dois objetos distintos da mesma classe, cada um com seu próprio $name. Saiba mais em PHP Constructor.
Criando um objeto a partir de um nome de classe em variável
A classe a ser instanciada não precisa ser definida em código — ela pode vir de uma variável. Isso é a base de fábricas, sistemas de plugins e contêineres de dependência:
<?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
Dentro de uma classe, muitas vezes é necessário criar outra instância da mesma classe. Duas palavras-chave fazem isso, e a diferença importa quando há herança:
new self— sempre instancia a classe onde a linha está escrita.new static— instancia a classe real em tempo de execução (late static binding), para que subclasses obtenham seu próprio 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() tivesse usado new self(), ambas as chamadas retornariam Animal. Veja Static Keyword para mais informações sobre late static binding.
Classes anônimas
Quando você precisa de um objeto único e não quer nomear uma classe, new class cria e instancia uma classe anônima em uma única expressão:
<?php
$logger = new class {
public function log(string $message): void
{
echo "LOG: $message";
}
};
$logger->log("started");
// Output: LOG: startedClasses anônimas podem receber argumentos no construtor, implementar interfaces e estender outras classes — úteis para mocks rápidos e callbacks leves.
Chamando um método diretamente em new (PHP 8.4+)
Historicamente, era necessário envolver uma expressão new entre parênteses para chamar um método no objeto recém-criado. Desde o PHP 8.4, os parênteses são opcionais:
// PHP 8.4 and later:
$name = new User("Alice")->name;
// Before PHP 8.4 you had to write:
$name = (new User("Alice"))->name;Use a forma com parênteses se precisar oferecer suporte ao PHP 8.3 ou versões anteriores.
Armadilhas comuns
newretorna um objeto, nunca uma cópia. Atribuir o objeto a outra variável copia o handle, não o objeto. Para obter uma cópia independente, use clone.- Argumentos ausentes geram um erro. Se o construtor declara parâmetros obrigatórios e você os omite, o PHP lança um
ArgumentCountError. - Esquecer parênteses em uma instanciação simples.
new MyClass(sem parênteses) só é válido quando nenhum argumento de construtor é necessário; prefiranew MyClass()para clareza fora do caso de encadeamento de métodos do 8.4.
Tópicos relacionados
- PHP Classes and Objects — a base sobre a qual
newé construído. - PHP Constructor — como os argumentos passados a
newsão recebidos. - clone — duplicar um objeto que você já criou.
- Static Keyword —
new statice late static binding.