Php 创建具有多(多)个参数的对象的最佳实践(构造函数vs setter)?
我的代码库中有相当多的POPO(普通的旧PHP对象),其中一些包含超过30个字段。其中一些对象有许多必填字段,以及许多可选字段(其中一些设置了默认值) 以下是其中一个类的简化版本:Php 创建具有多(多)个参数的对象的最佳实践(构造函数vs setter)?,php,object,constructor,setter,Php,Object,Constructor,Setter,我的代码库中有相当多的POPO(普通的旧PHP对象),其中一些包含超过30个字段。其中一些对象有许多必填字段,以及许多可选字段(其中一些设置了默认值) 以下是其中一个类的简化版本: Class POPO { private $required; private $alsoRequired; private $defaultSet = 100; private $optional; private $alsoOptional; public fu
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
...
}
我的问题是关于最佳实践。对于实例化对象和设置值,我有两个选项:
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.
类POPO
{
受保护的$conf;
公共函数构造(PopoConfiguration$conf)
{
$this->conf=$conf;
}
//从现在开始,使用$this->conf getters
}
类popo配置
{
所需受保护美元;
还需要受保护的美元;
受保护的$defaultSet=100;
受保护的美元可选;
受保护的$alsoOptional;
公共函数构造(/*必需参数*/)
{
// ...
}
//接球手和接球手
}
$popoConf=新的PopoConfiguration();
//在这里操作您的配置
$popoConf->setAlsoOptional(42);
// ...
//实例化POPO
$popo=新popo($popoConf);
- 所有必需的参数在技术上都是必需的(在PopoConfiguration的构造函数中)
- 可以在实例化新POPO之前设置所有可选参数
- 一旦您实例化一个新的POPO,它将被完全配置并处于可用状态
- 该代码是可测试的
- 一个类只负责设置值(可能带有某种形式的验证),一个类只负责设置值 负责POPOing(无论是什么)。这将使它们内部的业务逻辑更加清晰
如果有很多参数(参数的数量会影响可读性),最好只通过setter进行设置。方法1听起来不错。使用关联数组传递可选属性非常有效。这减少了必须调用的函数的数量。我现在也遇到了同样的问题。需要具有许多字段和其中一些字段(可能很多字段)的普通对象。没有更多的答案或评论?