W3docs

new

Ключевое слово new в PHP создаёт объекты из классов. Синтаксис, аргументы конструктора, анонимные классы и new static — в этой статье.

Ключевое слово PHP new

Класс — это шаблон; объект (или экземпляр) — конкретная вещь, созданная по этому шаблону. Ключевое слово new как раз и выполняет создание — оно выделяет новый объект, запускает конструктор класса и возвращает вам ссылку на результат. Практически всякий раз, когда вы работаете с объектами в PHP, new является отправной точкой.

На этой странице рассматриваются синтаксис new, что происходит при его вызове, как работают аргументы конструктора, а также современные варианты использования, с которыми вы встретитесь в реальном коде (динамические имена классов, new self/new static, анонимные классы и форма без скобок, добавленная в PHP 8.4).

Синтаксис

$object = new ClassName(arguments);
  • new запускает создание экземпляра.
  • ClassName — класс, который нужно создать.
  • arguments передаются методу __construct() класса. Если у класса нет конструктора или конструктор не принимает параметров, можно использовать пустые скобки new ClassName().

Результатом является дескриптор объекта, присваиваемый переменной $object. Повторный вызов new для того же класса создаёт отдельный, независимый объект.

Первый пример

<?php

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

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

После того как объект создан, для вызова его методов и чтения свойств используется оператор ->.

Передача аргументов конструктору

Если в классе определён метод __construct(), аргументы, указанные в скобках после new, передаются в него. Именно так каждый объект получает своё начальное состояние:

<?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 и $bob — два разных объекта одного класса, каждый хранит собственный $name. Подробнее читайте в PHP Constructor.

«Попробуйте сами» недоступно для этого примера.

Создание объекта по имени класса из переменной

Класс для создания экземпляра не обязательно указывать явно — он может браться из переменной. Это основа фабрик, систем плагинов и контейнеров зависимостей:

<?php

class PdfReport {}
class CsvReport {}

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

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

new self, new static и new parent

Внутри класса нередко нужно создать ещё один экземпляр того же класса. Два ключевых слова выполняют эту задачу, и разница между ними важна при наследовании:

  • new self — всегда создаёт экземпляр того класса, в котором написана эта строка.
  • new static — создаёт экземпляр фактического класса во время выполнения (позднее статическое связывание), поэтому подклассы получают свой собственный тип.
<?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`)

Если бы create() использовал new self(), оба вызова возвращали бы Animal. Подробнее о позднем статическом связывании читайте в Static Keyword.

Анонимные классы

Когда нужен одноразовый объект без присвоения имени классу, new class создаёт и инстанциирует анонимный класс в одном выражении:

<?php

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

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

Анонимные классы могут принимать аргументы конструктора, реализовывать интерфейсы и расширять другие классы — они удобны для быстрых заглушек и легковесных колбэков.

Вызов метода непосредственно на new (PHP 8.4+)

Исторически для вызова метода на только что созданном объекте выражение new нужно было заключать в скобки. Начиная с PHP 8.4 скобки необязательны:

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

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

Используйте форму со скобками, если нужна поддержка PHP 8.3 или более ранних версий.

Типичные ошибки

  • new возвращает объект, а не копию. Присвоение объекта другой переменной копирует дескриптор, а не сам объект. Чтобы получить независимый дубликат, используйте clone.
  • Отсутствие аргументов вызывает ошибку. Если конструктор объявляет обязательные параметры, а вы их опускаете, PHP выбрасывает ArgumentCountError.
  • Забытые скобки при простом создании экземпляра. new MyClass (без скобок) допустимо только тогда, когда конструктор не требует аргументов; для ясности предпочтительна форма new MyClass(), за исключением случаев цепочки методов в PHP 8.4.

Связанные темы

  • PHP Classes and Objects — основа, на которой строится new.
  • PHP Constructor — как принимаются аргументы, переданные в new.
  • clone — дублирование уже созданного объекта.
  • Static Keywordnew static и позднее статическое связывание.

Практика

Практика
Каков синтаксис для создания нового объекта в PHP?
Каков синтаксис для создания нового объекта в PHP?
Was this page helpful?