【问题标题】:Will Hack language support function-overloading polymorphism?Hack 语言会支持函数重载多态吗?
【发布时间】:2014-08-03 15:12:18
【问题描述】:

我试图弄清楚如何在 Hack 中实现访问者模式。它显然需要函数重载多态,但正如我所测试的,这个例子:

<?hh // strict
class Visitor {
    public function visit(string $s) : void {}
    public function visit(int $i) : void {}
}

产生通常的 PHP 的

Fatal error: Redeclared method Visitor::visit in hh-polymorphism.php on line 4

既然这个失败了,那么我想问一下将来是否有计划支持这个?或者有什么因素会阻止它的实施?

【问题讨论】:

  • 您可以将您的函数命名为visitStringvisitInt 等。访问者模式不需要重载,通常就是这样。
  • @sepp2k:是的,但这不是重点。我还在某处听说汇编程序之上的任何东西都只是语法糖。

标签: polymorphism language-design language-features hacklang


【解决方案1】:

我们几乎肯定不会在 Hack 中出现重载,as I explained in this feature request。你可以在那里看到详细的答案,但问题的关键在于它会完全破坏与普通 PHP 的互操作性,甚至是部分模式——你需要完整的类型信息才能真正解决我们无法解决的重载问题除了 100% 严格模式外,我们承诺我们有。 (还有其他原因,请参阅该链接。)

对于您的示例,您总是可以这样做,利用 mixed 和 Hack 的流量敏感性:

<?hh // strict
class Visitor {
  public function visitString(string $s): void {
    // ...
  }
  public function visitInt(int $i): void {
    // ...
  }
  public function visit(mixed $m): void {
    if (is_int($m)) {
      $this->visitInt($m);
    } else if (is_string($m)) {
      $this->visitString($m);
    } else if (...) {
      ...
    } else {
       invariant_violation('Unexpected type in visitor: %s', gettype($m));
    }
  }
}

【讨论】:

  • 好的,我知道方法解析是多么棘手,尤其是在运行时。但我看不出这将如何破坏互操作性。你能更详细地解释一下你的意思吗?据我了解,类型检查器已经在hhvm 中就位,并且它在运行时运行。在引发类型错误之前再走一步(即tryResolvePolyMethod)不会破坏任何东西。
  • 类型检查器 nothhvm 内,并且在运行时不能完全运行。大多数 Hack 类型系统是由hh_client/hh_server 静态分析工具执行的,而不是由运行时本身执行的。在实际执行代码时,hhvm 具有泛型的擦除语义等等——所以不,我们不一定拥有hh_client 拥有的完整、丰富的类型信息。
  • 但是您拥有提出Fatal error: Argument 1 passed to Foo::doFoo() must be an instance of string, int given所需的信息。这还不足以使超载工作吗?抱歉,我想问一下,我只是想了解这是实际的互操作性问题还是平台限制。
  • 是的,但是重载决议是基于运行时类型而不是静态类型信息。这可能会导致来自 Java 或 C++ 的令人惊讶的行为,当派生类和多态性发挥作用时,AIUI 基于静态类型信息。更不用说与无类型代码的互操作性(我们添加的任何内容都需要与无类型代码一起使用,即使它是针对严格模式的)。对$this-&gt;foo($bar) 的调用基本上取决于$bar 是什么。所以主要是互操作问题。 (实际上将静态信息导入 HHVM 也存在平台限制。)
  • 放弃原生 PHP 支持是的,但不会放弃对部分类型代码的支持(至少现在还没有)。同样的问题也发生在那里。下次我遇到他们时,我会向团队提出这个问题(我自己不再从事 HHVM/Hack 工作),但如果很快就计划好了,我会感到惊讶。
猜你喜欢
  • 2011-04-07
  • 2013-10-15
  • 2011-11-08
  • 2015-10-29
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多