2014-01-16 87 views
1

让所有类构造函数都采用一个params数组而不是多个参数是一个好主意吗?PHP构造函数采用一个数组而不是多个参数

例如,

class A { 

private $id; 
private $name; 

__construct($arr) { 
    foreach ($arr as $key => $val) { 
     $this->$key = $val; 
    } 

} 

} 

,而不是

class B { 

private $id; 
private $name; 

__construct($id, $name) { 
    $this->id = $id; 
    $this->name = $name; 

} 

} 

这将消除需要记住的参数的顺序,并键入需要 “$这个 - >键= $ VAL”每次我添加一个新的参数。这种方法有什么缺点吗?

+0

这可能会被关闭,因为意见可能会有所不同。 –

+0

我会争辩B类,因为它允许类型暗示 –

回答

3

虽然这是真正的意见,但我不认为这是一般的良好做法。您将失去在功能/方法边界强制执行正确呼叫签名的能力。您将失去为传递的参数强制执行类型的能力(或为支持此类的IDE提供类型提示)。所以,这样的事情不能被强制执行:

function foo ($bar, PDO $pdo_obj) {} 

你也失去了你提供这样的默认参数值的能力:

function foo ($bar, $optional = 'default') {} 

你也可能暴露方法意外行为。例如,如果有人采用了您在示例中建议的方法。什么是阻止调用者传递可能耗尽内存分配的任意长度的数组?

实际上,你甚至不应该设计功能,无论如何都需要超过3或4个参数,所以我不知道你真的在这里获得什么,除了能够以未定义的顺序获得“参数”。这种“灵活性”的代价是,您需要围绕任何参数创建数组包装,否则这些参数将直接传递给函数/方法。

最后,我会评论说,你建议的方法不是PHP中的典型编码实践。因此,如果你期望别人使用你的代码,那么这种方法可能会让他们感到困惑,因为它通常不会遇到。

2

缺点是你更可能忘记设置特定的参数。虽然有办法控制。我知道的最好方法是创建一个例外类,例如MissingParameterException,并为任何缺少的必需参数抛出该类的异常。您也可以对类型错误的类型进行类型检查并抛出异常。为了防止越来越意外设定随机属性未知

if(property_exists($this, $key)) { 
    $this->$key = $val; 
} 

我想补充一个检查这样。

我担心的是你的对象在构造函数中需要这么多的参数,所以你不能保持它们的直线。有关不同设计模式的讨论,请参见how-many-constructor-arguments-is-too-many

2

缺点是你根本没有类型暗示。如果您有单独的参数,并且您使用的是像NetBeans或PHPStorm这样的适当IDE,则可以使用可用工具来帮助您记住参数的顺序。如果你只传入一个数组,那么你忘记添加一个参数或者稍后添加一个参数,忘记修改对构造函数的某个调用时,就没有这些信息,没有类型提示和没有具体错误。

所以我会选择不这样做,虽然意见可能会在这个问题上有所不同。在Javascript中它似乎更常见。 JQuery和其他库很大程度上依赖于此机制,但对于PHP,由于上述原因,我不会这样做。

0

这在我看来是不好的。客观地说,我认为这会让代码更难以遵循维护代码库的任何人,因为它是非常规的。此外,我认为当你不需要记住参数的顺序时,你更可能引入错误,因为你正在为代码添加一层模糊处理。

不可否认,我认为这很糟糕的部分原因是因为我第一次学习了Java编程,并且偏向于Java设计模式,并认为一致性很重要。

相关问题