Неизменный объект со многими свойствами

У меня есть класс, который я хочу сделать неизменным, но у этого класса есть много свойств.

<?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';
}

}

0

Решение

я хотел бы использовать __задавать() магический метод, чтобы проверить, установлено ли значение, иначе я бы бросил исключение:

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 __set($property, $value)
{
if (property_exists($this, $property)) {
if(is_null($this->$property)){
$this->$property = $value;
return $this;
}
throw MyCustomException();
}
throw UndefinedClassVariableException();
}
}

Основное использование будет:

$x = new Gameworld();
$x->name = "OK";
$x->is_online = true;
$x->name="Exception";

P.S: Исключения должны расширить базовый класс исключений или ты мог спусковой крючок или же журнал ошибка, зависит от того, что вы хотите

P.S.S: Альтернативное решение было бы использовать __вызов() метод и проверьте, если значение равно нулю

3

Другие решения

Я бы предложил передать свойства в качестве аргумента массива, как

__construct( array $properties )
{
$this->property = $properties['property'];
....
}
0

По вопросам рекламы [email protected]