3

我试图弄清楚如何在 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

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

4

1 回答 1

3

正如我在此功能请求中解释的那样,我们几乎可以肯定在 Hack 中无法重载。你可以在那里看到详细的答案,但问题的关键在于它会完全破坏与普通 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));
    }
  }
}
于 2014-08-03T18:41:13.463 回答