3

Hack で Visitor パターンを実装する方法を見つけようとしていました。明らかに関数オーバーロードのポリモヒズムが必要ですが、私がテストしたように、この例は次のとおりです。

<?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 に答える