PHP
#php#php-8-5#bitrix#clone-with#dto#readonly#order#status

PHP 8.5: clone with для value-объекта статуса заказа (Bitrix)

Иммутабельный DTO статуса заказа с clone with (PHP 8.5): клонирование с подменой полей без методов withX(). По RFC clone with.

Как использовать

  1. Скопируйте нужный фрагмент кода.
  2. Вставьте в свой проект и при необходимости измените под задачу.
  3. Проверьте зависимости и окружение (версии, переменные).

В 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.