gpt4 book ai didi

php - 伪重载的私有(private)属性

转载 作者:行者123 更新时间:2023-12-04 04:39:37 25 4
gpt4 key购买 nike

假设我有这样的类(class):

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

有时我需要调用它只传递第一个和第三个参数。问题是我必须放第二个参数,传递任何东西,才能达到第三个。

我可以为可选参数创建私有(private)属性和设置方法,并将它们从方法签名中删除。

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

我在 S.O. 中读到的资料来源:
  • What is function overloading and overriding in php?
  • PHP function overloading

  • 并在手册中:
  • http://www.php.net/manual/en/language.oop5.overloading.php
  • http://www.php.net/manual/en/function.func-get-args.php
  • 最佳答案

    I could create private properties and setters methods for the optionals params and remove them from the method signature.



    如果原因是您希望他们让开,那么这样做将是一个非常糟糕的主意。

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

    我们无法判断将参数改为属性是否有意义,因此对于其余部分,我将假设它没有意义。在这种情况下有哪些选择?

    选项 #1:重构
  • 在这个方法上有两个可选参数有意义吗?
  • 在调用它时,您通常会忽略其中一个(或两个)吗?

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

    选项 #2:属性捆绑
  • 这种方法是否有很多具有合理默认值的参数?
  • 在典型的通话中,您通常只提供其中的几个(或不提供)吗?

  • 如果这些问题的答案是"is",那么您可以使该方法接受一个数组作为其最后一个参数,并将其用作“其他选项”的容器。

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

    选项#3:流畅的界面

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

    编写流畅的接口(interface)涉及一个新类,该类封装了所有可能进入函数调用的参数;该类对每个参数都有一个方法,以及一个或多个使用这些参数工作的方法。一个流畅的接口(interface)调用站点看起来像
    $foo->bar()->color('red')->type('widget')->execute();

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

    关于php - 伪重载的私有(private)属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19103666/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com