【发布时间】:2017-05-28 05:44:26
【问题描述】:
我的代码库中有很多 POPO(普通旧 PHP 对象),其中一些包含超过 30 个字段。其中一些对象有许多必填字段,以及许多可选字段(其中一些设置了默认值。)
以下是这些类之一的简化版本:
Class POPO {
private $required;
private $alsoRequired;
private $defaultSet = 100;
private $optional;
private $alsoOptional;
public function __construct() {
//some constructor code
}
public function setRequired($required) {
//validate here
$this->required = $required;
}
//other setters
...
}
我的问题是关于最佳实践的。我想实例化对象并设置值,我有两个选择:
-
我可以创建一个包含非必需字段的默认值的构造函数,并为可选内容使用 setter:
public function __construct( $required, $alsoRequired ) { $this->setRequired(1); $this->setAlsoRequired(2); } $POPO1 = new POPO(1,2); //to instanciate new object w/ only required fields. $POPO1->setOptional(3); //to set optional fields -
我可以使用可选参数创建一个包含所有字段的构造函数:
public function __construct( $required, $alsoRequired, $optional = null, $alsoOptional = null ) { $this->setRequired($required); $this->setAlsoRequired($alsoRequired); $this->setOptional($optional); $this->setAlsoOptional($alsoOptional); } $POPO1 = newPOPO(1,2); //instanciate new object w/ only required fields. $POPO2 = newPOPO(1,2,3,4); //instanciate object w/ optional fields.
在类中添加或删除参数时,这会让人感到困惑。必须更新使用该类的每个实例。选项 1 也是如此,但程度较轻。
我想到了一个第三个选项,它有一个无参数构造函数并为所有内容使用 setter,但这将允许对象处于无效状态。
所以我的问题是,这两个选项中哪一个更好?
也许我还没有想到其他更好的方法?
如何处理默认值?应该只通过 setter 来完成吗?
【问题讨论】:
-
方法 1 听起来不错。使用关联数组移交可选属性效果很好。这减少了必须调用的函数的数量。
-
我现在也遇到了同样的问题。具有许多字段的普通对象,其中一些(也许很多)是必需的。没有更多的答案或 cmets?
标签: php object constructor setter