W3docs

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);
  • new dispara a instanciação.
  • ClassName é a classe a ser instanciada.
  • arguments sã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 vazios new 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.

"Experimente Você Mesmo" não está disponível para este exemplo.

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

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

Classes 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

  • new retorna 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; prefira new MyClass() para clareza fora do caso de encadeamento de métodos do 8.4.

Tópicos relacionados

Prática

Prática
Qual é a sintaxe para inicializar um novo objeto em PHP?
Qual é a sintaxe para inicializar um novo objeto em PHP?
Was this page helpful?