12

現在の PHP 5.4 実装でこの動作が可能である正当な理由があるかどうか疑問に思っています。

trait T {
    public function test(PDO $pdo) {}
}

class C {
    use T;
    public function test(DOMDocument $dom) {}
}

クラスがトレイトを使用するという事実は、このクラスが特定のインターフェースを利用できることを保証していると思いました。しかし、ここで、トレイト メソッドを別の目的でうっかりオーバーライドしてしまうと、古典的な継承のように、厳格な標準の通知さえも受け取りません。

これは特に意図的に許可されていますか?何のために?

4

1 に答える 1

29

この動作は文書化されています。php.net から ( http://php.net/manual/en/language.oop5.traits.php ):

基本クラスから継承されたメンバーは、特性によって挿入されたメンバーによってオーバーライドされます。優先順位は、現在のクラスのメンバーが Trait メソッドをオーバーライドし、その代わりに継承されたメソッドをオーバーライドするというものです。

ここで通知する理由はありません。

編集:

このトピックに光を当てるために、より深刻な文献をいくつか調べました:)。そのような振る舞いは特性の定義の一部のようです。彼らはこのように働くように指導されています。これは、研究「Traits: Composable Units of Behavior」(オブジェクト指向プログラミングに関するヨーロッパ会議の議事録) からのものです。

トレイト構成のもう 1 つの特性は、構成順序が無関係であるため、競合するトレイト メソッドを明示的に明確にする必要があることです (セクション 3.5 を参照)。クラスで定義されたメソッドと組み込まれたトレイトで定義されたメソッドとの間の競合は、次の 2 つの優先順位規則を使用して解決されます。

– クラス メソッドは、トレイト メソッドよりも優先されます。

– 特性メソッドはスーパークラス メソッドよりも優先されます。これは、トレイト メソッドがクラス自体で定義されているかのように動作することを示すフラット化プロパティに由来します。

ここで詳細を読むことができます: http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf

于 2012-07-17T11:36:26.783 に答える