伪重载的私有属性

时间:2013-09-30 20:55:45

标签: php

假设我有一个这样的课程:

class Foo{
    public function bar($p,$p2=null,$p3=null){
        //...
    }
}

有时我需要称它通过第一和第三个参数。问题是我必须把第二个参数传递给任何东西,只是为了达到第三个。

我可以为选项params创建私有属性和setter方法,并从方法签名中删除它们。

这是一个好习惯吗?或者最好使用__callfunc_get_args

我在S.O.中读过的消息来源:

并在手册中:

2 个答案:

答案 0 :(得分:2)

  

我可以为它创建私有属性和setter方法   optionals params并从方法签名中删除它们。

如果原因是你想要让它们偏离,那么这样做将是一个非常糟糕的主意。

什么是参数,什么是属性是构成类设计的决策,因此只有在查看大图(如同任何其他设计决策)之后才能进行另一个参数的交换。 不要进行此类更改,因为您不喜欢某个特定方法的特定调用网站的读取方式。

我们无法判断参数是否属于某个属性是有意义的,所以对于余数我会假设它没有。在这种情况下有哪些选择?

选项#1:重构

  • 在此方法上有两个可选参数是否有意义?
  • 在打电话时,你通常会遗漏一个(或两个)吗?

如果这些问题的答案为“是”,则可能表明该方法根据参数以不同的模式运行。在这种情况下,将模态行为分解为具有简化签名的单独方法是有意义的。

选项#2:属性包

  • 这种方法是否有很多具有合理默认值的参数?
  • 在典型的电话中,您通常只提供少数(或没有)这些吗?

如果这些问题的答案是“是”,那么你可以让方法接受一个数组作为它的最后一个参数,并将其用作“misc选项”的容器。

这种方法有一个(大的!)缺点,即这些选项不再通过方法签名进行广告宣传了,但如果有合理的默认值,你将无法在90%的时间内触及它。

选项#3:Fluent界面

如果有很多选项可以指定,那么创建一个流畅的界面是有意义的,但这是一个很大的变化,除非有其他参数,否则不应该进行(例如,如果需要可组合性) )。您可以将流畅的界面视为将参数转换为属性的更好设计版本。

编写一个流畅的接口涉及一个新类,它封装了可能进入函数调用的所有参数;该类为每个参数提供一个方法,并使用这些参数执行一个或多个方法。一个流畅的界面调用网站看起来像

$foo->bar()->color('red')->type('widget')->execute();

此处$foo->bar()返回封装类的实例,colortype是该类设置属性的方法,execute读取这些属性并执行实际工作

答案 1 :(得分:1)

如何使用funct_get_argscall定义哪个参数是第二个或第三个参数? 只有它们有不同的类型才有可能。

在我看来,如果你想要一个强大的方法来处理许多参数,这些参数可能是选项使用像bundle对象这样的容器(通用或特定于你的函数),或者更友好的是一个关联数组。