У меня есть класс, который я хочу сделать неизменным, но у этого класса есть много свойств.
<?php
class Gameworld {
/** @var string */
private $name;
/** @var string */
private $type;
/** @var bool */
private $is_online;
/** @var int */
private $online_players;
/** @var int */
private $online_players_record;
/** @var string */
private $description;
/** @var string */
private $location;
/** @var \DateTime */
private $created_at;
}
Как создать такой объект? Когда я введу public function __construct()
со всеми этими свойствами, он будет раздутым. Если я представлю сеттеры, это больше не будет неизменным.
РЕДАКТИРОВАТЬ: Я думал о создании сеттеров, но те, которые могут быть использованы только один раз. Благодаря этому у меня не будет раздутого конструктора, но по какой-то причине это кажется не очень хорошей идеей. Что-то вроде:
class Gameworld {
... old properties ...
/** @var array */
private $used_setters = [];
public function setName(string $name){
if(in_array('name', $this->used_setters)){
throw new ImmutableException('Class Gameworld is immutable.');
}
$this->name = $name;
$this->used_setters[] = 'name';
}
}