Как сделать опциональные поля в DTO?

В PHP вы можете создавать опциональные поля в классах DTO (Data Transfer Object) путем использования аргументов по умолчанию или проверки наличия значения перед его использованием.

Самый простой способ сделать опциональные поля в DTO - использовать аргументы по умолчанию в конструкторе класса DTO. Например:

class UserDTO {
    private $name;
    private $age;
    private $email;

    public function __construct($name, $age = null, $email = null) {
        $this->name = $name;
        $this->age = $age;
        $this->email = $email;
    }

    // ...геттеры и сеттеры
}

В этом примере name считается обязательным полем, тогда как age и email являются опциональными, так как они имеют значения по умолчанию равные null. При создании объекта UserDTO вы можете передать только обязательные поля, опциональные будут иметь значения по умолчанию:

$user1 = new UserDTO('John Doe');
$user2 = new UserDTO('Jane Smith', 25);
$user3 = new UserDTO('Mark Johnson', 30, '[email protected]');

Еще один вариант - проверка наличия значения поля перед его использованием. В этом случае вы можете использовать isset() или null coalescing operator (??):

class UserDTO {
    private $name;
    private $age;
    private $email;

    public function __construct($name, $age = null, $email = null) {
        $this->name = $name;
        $this->age = isset($age) ? $age : null;
        $this->email = $email ?? null;
    }

    // ...геттеры и сеттеры
}

Таким образом, если поле age не будет передано в конструктор или его значение будет равно null, оно сохранится как null в объекте UserDTO. То же самое происходит для поля email с использованием null coalescing operator.

Оба подхода имеют свои преимущества и недостатки, и выбор зависит от конкретных потребностей вашего проекта. Если вам нужно указать опциональные поля при создании объекта DTO, аргументы по умолчанию могут быть более удобными. Если вы хотите иметь большую гибкость в установке полей, проверка наличия значения может быть более полезной. В любом случае, оба варианта позволяют создавать DTO с опциональными полями в PHP.