PHP 8.5: clone with для value-объекта статуса заказа (Bitrix)
Иммутабельный DTO статуса заказа с clone with (PHP 8.5): клонирование с подменой полей без методов withX(). По RFC clone with.
Как использовать
- Скопируйте нужный фрагмент кода.
- Вставьте в свой проект и при необходимости измените под задачу.
- Проверьте зависимости и окружение (версии, переменные).
В PHP 8.5 конструкция clone with позволяет клонировать объект и сразу задать новые значения свойств (в том числе readonly). Синтаксис: clone $object with ["property" => value]. Удобно для DTO и value-объектов в Bitrix: статусы заказов, стадии сделок, настройки — без ручных методов withStatus() / withLabel().
<?php
/**
* Value-объект статуса заказа (PHP 8.5+).
* clone with — нативная замена wither-методам.
*/
readonly class OrderStatusDto
{
public function __construct(
public string $code,
public string $label,
public bool $isFinal = false,
) {}
public function withLabel(string $label): self
{
return clone $this with ['label' => $label];
}
public function withCode(string $code): self
{
return clone $this with ['code' => $code];
}
}
// Использование: исходный объект не меняется
$status = new OrderStatusDto('P', 'Оплачен', false);
$ru = $status->withLabel('Оплачен (RU)');
$en = $status->withLabel('Paid');
Usage:
// Маппинг кода статуса Bitrix в DTO с подстановкой под язык
$status = new OrderStatusDto(
$order->getField('STATUS_ID'),
GetMessage('STATUS_P') ?: 'Оплачен',
in_array($order->getField('STATUS_ID'), ['F', 'C'], true)
);
$localized = $status->withLabel(GetMessage('STATUS_P_LOCALIZED'));
Notes:
⚠️ По RFC clone with: массив после with — пары "имя_свойства" => значение. Соблюдаются видимость и типы. Для readonly-свойств изменение допустимо только в момент clone with. Документация PHP: Clone function.