22

staticPHP 7 で、戻り値の型を持つインターフェイスを宣言できないのはなぜですか?

次のクラスがあるとします。

interface BigNumber {
    /**
     * @param BigNumber $that
     *
     * @return static
     */
    public function plus(BigNumber $that);
}

class BigInteger implements BigNumber { ... }
class BigDecimal implements BigNumber { ... }

plus()メソッドの戻り値の型を に強制したいstatic、つまり:

  • BigInteger::plus()を返す必要がありますBigInteger
  • BigDecimal::plus()を返す必要がありますBigDecimal

次の方法でインターフェイスを宣言できます。

public function plus(BigNumber $that) : BigNumber;

しかし、それは上記を強制しません。私がやりたいことは次のとおりです。

public function plus(BigNumber $that) : static;

しかし、PHP 7 は今のところ満足していません。

PHP 解析エラー: 構文エラー、予期しない「静的」(T_STATIC)

これには特定の理由がありますか、それとも報告すべきバグですか?

4

2 に答える 2

16

2020年アップデート

PHP 8では、静的な戻り値の型が導入されました。

于 2020-01-31T13:49:59.580 に答える
7

これはバグではなく、オブジェクト指向プログラミングの観点から設計的に意味がありません。

と の両方BigIntegerを実装する場合、それらが履行するコントラクトを気にします。この場合、それはのインターフェースです。BigDecimalBigNumberBigNumber

したがって、インターフェイスで使用する必要がある戻り値の型はBigNumber、そのインターフェイスに対してコーディングする人は、そのインターフェイスのメンバー以外は何も知らないためです。どちらが返されるかを知る必要がある場合は、そもそもインターフェイスが広すぎる可能性があります。

注: ジェネリックを使用するプログラミング言語は戻り値の型をジェネリック型として指定することでこの効果を実現できますが、PHP にはジェネリックがなく、おそらく近い将来にはなくなるでしょう。

于 2015-06-20T10:26:34.310 に答える