В PHP 8.5 наконец-то будет clone with!
Как-то незаметно в PHP 8.5 приняли долгожданный RFC https://wiki.php.net/rfc/clone_with_v2.
1. Клонирование теперь не только языковая конструкция, но и функция clone(object $object, array $withProperties = []): object
. Благодаря этому можно писать array_map(clone(...), $myObjects)
.
2. Вторым аргументом можно передать новые значения свойств для склонированного экземпляра. Переопределить можно любые видимые в текущей области свойства, в том числе readonly
, что наконец-то даёт нам полный инструментарий для работы с иммутабельными структурами:
final readonly class Request
{
public function __construct(
public string $path = '',
public array $headers = [],
) {}
public function withPath(string $path): self
{
return clone($this, ['path' => $path]);
}
public function withHeader(string $name, string $value): self
{
return clone($this, ['headers' => [
...$this->headers,
$name => $value,
]]);
}
}
new Request()
->withPath('/phpyh')
->withHeader('Content-Type', 'application/json');
Почему это важная фича и как без неё обходиться прямо сейчас, подробно рассказал Brent Roose в ролике
____________
До конца завтрашнего дня билеты на Пых.конф’25 всего по 12 000 рублей!