【问题标题】:Method overloading in PHP is bad practice?PHP中的方法重载是不好的做法?
【发布时间】:2017-10-04 15:21:11
【问题描述】:

尝试使用 PHP 实现 method overloading(不要与 PHP manual 的重载定义混淆),这并不容易,因为 PHP 的性质,你必须有一种方法和 ifswitch 语句内部提供重载,它创建的过程代码难以在长方法中阅读。

在 PHP 中方法重载有什么好处,可以通过其他方式实现吗?

class MyClass {

   public function doMany($input) {

      if (is_array($input)) {
         ...
      } else if (is_float($input)) {
         ...
      }

   }

}

与传统方法相比

class MyClass {

   public function doArray(array $input) {
      ...
   }

   public function doFloat(float $input) {
      ...
   }

}

【问题讨论】:

  • 这个问题对我来说既非常宽泛,又非常基于意见。它可能softwareengineering.stackexchange.com 上更贴近主题,但请先仔细阅读他们的常见问题解答。如果你能描述一个你试图解决的更具体的问题,你可能会得到更好的回应——很难给出适用于所有可能使用方法重载的替代方案。
  • 如果您不想使用switch,则将gettype() 与为每种类型的单独方法调用动态定义的方法名称结合使用

标签: php overloading


【解决方案1】:

传统的方法是:

class Aclass {
  public function doStuff(int $a) {
    // return other stuff
  }

  public function doStuff(float $a) {
    // return other stuff
  }
}

注意相同的函数名称只是参数的类型不同。

如果你想在 php 中模拟重载,你的第一种方法通常是要走的路。一般来说,您并不需要在 PHP 中进行重载,因为它是松散类型的,根据定义,您不能真正进行重载。


回答你的问题。如果您确实需要重载,那么您的第一种方法似乎是合适的。使用开关使其更具可读性。

免责声明:虽然您可以这样做,但我不建议这样做。哎呀,如果你愿意,你几乎可以做任何事情。这并不意味着你应该这样做。

【讨论】:

  • 你不能 redclare doStuff。我认为您可能并不是要暗示“传统方法”块中的代码可以在 PHP 中运行,但指定它会导致致命错误可能是个好主意。
  • 没错,我不是说 PHP 中的“传统方法”。我的意思是硬类型语言中的传统方法。是的,它会引发致命的后果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 2011-07-07
  • 2021-05-07
  • 2014-06-13
相关资源
最近更新 更多