假设我有一个这样的课程:
class Foo{
public function bar($p,$p2=null,$p3=null){
//...
}
}
有时我需要称它通过第一和第三个参数。问题是我必须把第二个参数传递给任何东西,只是为了达到第三个。
我可以为选项params创建私有属性和setter方法,并从方法签名中删除它们。
这是一个好习惯吗?或者最好使用__call
或func_get_args
?
我在S.O.中读过的消息来源:
并在手册中:
答案 0 :(得分:2)
我可以为它创建私有属性和setter方法 optionals params并从方法签名中删除它们。
如果原因是你想要让它们偏离,那么这样做将是一个非常糟糕的主意。
什么是参数,什么是属性是构成类设计的决策,因此只有在查看大图(如同任何其他设计决策)之后才能进行另一个参数的交换。 不要进行此类更改,因为您不喜欢某个特定方法的特定调用网站的读取方式。
我们无法判断参数是否属于某个属性是有意义的,所以对于余数我会假设它没有。在这种情况下有哪些选择?
如果这些问题的答案为“是”,则可能表明该方法根据参数以不同的模式运行。在这种情况下,将模态行为分解为具有简化签名的单独方法是有意义的。
如果这些问题的答案是“是”,那么你可以让方法接受一个数组作为它的最后一个参数,并将其用作“misc选项”的容器。
这种方法有一个(大的!)缺点,即这些选项不再通过方法签名进行广告宣传了,但如果有合理的默认值,你将无法在90%的时间内触及它。
如果有很多选项可以指定,那么创建一个流畅的界面是有意义的,但这是一个很大的变化,除非有其他参数,否则不应该进行(例如,如果需要可组合性) )。您可以将流畅的界面视为将参数转换为属性的更好设计版本。
编写一个流畅的接口涉及一个新类,它封装了可能进入函数调用的所有参数;该类为每个参数提供一个方法,并使用这些参数执行一个或多个方法。一个流畅的界面调用网站看起来像
$foo->bar()->color('red')->type('widget')->execute();
此处$foo->bar()
返回封装类的实例,color
和type
是该类设置属性的方法,execute
读取这些属性并执行实际工作
答案 1 :(得分:1)
如何使用funct_get_args
或call
定义哪个参数是第二个或第三个参数?
只有它们有不同的类型才有可能。
在我看来,如果你想要一个强大的方法来处理许多参数,这些参数可能是选项使用像bundle对象这样的容器(通用或特定于你的函数),或者更友好的是一个关联数组。