具有许多属性的不可变对象

时间:2018-05-11 13:29:53

标签: php immutability

我有一个我想制作不可变的类,但该类有很多属性。

<?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()介绍所有这些属性时,它会变得臃肿。如果我介绍setter它将不再是不可变的。

编辑:我正在考虑制作setter但是只能使用一次。多亏了我不会有臃肿的构造函数但由于某种原因它似乎不是一个好主意。就像是:     

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

}

1 个答案:

答案 0 :(得分:0)

我建议将属性作为数组参数传递,如

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