【问题标题】:Type hinting and multiple constructors类型提示和多个构造函数
【发布时间】:2015-10-11 02:32:55
【问题描述】:

我一直在研究 PHP7 的新功能,并认为我可能会开始为我的项目准备它引入的新功能,例如标量类型提示。

我遇到的第一个问题是我在各种类中的构造函数。我有一些通用的委托人,它们的行为如下:

public function __construct($data = null) {
    if (is_numeric($data)) {
        $this->controller->createById($data);
    }
    elseif (is_array($data)) {
        $this->controller->createByArray($data);
    }
    elseif (strlen($data) > 0) {
        $this->controller->createByUrl($data);
    }
}

为此方法引入类型提示当然会全方位抛出错误。

据我所知,PHP7 没有引入对多个构造函数的支持。有没有办法解决这个问题,或者这是语言的限制之一?

【问题讨论】:

  • 不要为那个方法引入类型提示?
  • @N.B.是的,我知道这是一种可能性,但是从 OOP 的背景来看,我真的希望我的整个代码库都是真正面向对象的;)
  • 编程和 OOP 专门用于解决问题。您没有需要通过编程解决的问题,您患有强迫症,现在您将强迫症误认为是语言限制。可悲的是,这不是语言限制。这只是你身边的一些刺,因为你有一些愚蠢的构造函数可以接受任何东西,现在你想通过 3 个构造函数输入提示值是什么。这真的是“OOP”吗?解决不了问题的复杂、愚蠢的代码?
  • @N.B.我不敢苟同,构造函数重载在 Java 和 C++ 等典型的 OOP 语言中非常常见。问这个问题是因为我想知道是否有某种方法可以超越我不知道的 PHP 限制,遗憾的是它不是。 OCD 与想要利用类型提示的新功能来更严格地键入 PHP 无关。
  • 既然我想知道您要解决的问题是什么,您是否有机会编写伪php代码并重载构造函数(想象PHP支持它),以便更清楚如何 你会接近你想要的, 你要解决的问题是什么。如果我站在你的立场上,我会有不同的方法将某种类型的变量传递给创建更多东西的构造函数,但这就是我,我可能很傻、很老而且完全错误。介意与我们分享您的想法吗?

标签: php php-7


【解决方案1】:

正确,这是语言的限制之一。 (并且strlen() > 0 无论如何都无法通过类型进行检查。自动转换为字符串......所以你的方法允许除“”、null 和 false 之外的所有内容?)

一般来说,草案中有 RFCs 来扩展 PHP 在 7.1 中的类型提示: https://wiki.php.net/rfc/union_types

这样你就可以写int | float | array | string $data = null

【讨论】:

  • 是的,我很害怕。感谢您为联合类型链接 rfc。太糟糕了 PHP 不支持多个构造函数,尽管它可能会在未来的版本中出现,因为它比以前更相关。无论如何,感谢您对我的问题的明确回答。
  • 函数重载(多个构造函数的通用版本)不会真正出现在 PHP 中,因为它无法解决冲突,尤其是弱类型提示(不是严格类型)[或者我们需要复杂的规则优先级这最终会让每个人都感到困惑……尤其是declare(strict_types=1) 是特定于调用者的……不同打字模式的不同行为?什么?!?]。这就是为什么我们宁愿走联合类型的方式,这将允许你做什么。
猜你喜欢
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2016-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多