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: CsvReportnew 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 Keyword —
new staticи позднее статическое связывание.