2012-07-17 10 views
11

この動作は、現在のPHP 5.4の実装で可能である理由は何か良い理由がある場合、私は思ったんだけど:PHP 5.4:なぜ、クラスは異なるシグネチャでtraitメソッドをオーバーライドできますか?

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

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

私はクラスの特性を利用しているという事実は、このクラスは特定していたことを保証することを考えました利用可能なインタフェース。しかしここで、誤って別の目的のためにtraitメソッドをオーバーライドすると、古典的な継承の場合と同様に、Strict Standardsの通知を受け取ることさえありません。

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

答えて

26

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

Anが特色によって挿入部材 によってオーバーライドされる基本クラスからメンバを継承しました。優先順位は、 の現在のクラスのメンバーがTraitメソッドをオーバーライドすることです。返されるのは 継承されたメソッドです。

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

編集:

私はこのトピックに関するいくつかの光を当てるために、いくつかのより深刻な文学に見ていた:)。そのような行動は形質の定義の一部であるように見える。彼らはこのように働かなければならない。これは、研究からである「トレイト:行動の構成可能な単位」(オブジェクト指向プログラミングに関する欧州会議議事録):

特性の組成物の別の特性は、組成物の順序は 無関係であるため、詐欺FL ictingトレイト方法ということです明示的に を明確にする必要があります(セクション3.5を参照)。 で定義されたメソッド間のコンフリクトは、組み込まれた特性によって定義されたクラスおよびメソッドは、 を使用して次の2つの優先ルールを使用して解決されます。

- クラスメソッドは、traitメソッドよりも優先されます。

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

あなたはここで多くを読むことができます:あなたの答えのためのhttp://scg.unibe.ch/archive/papers/Scha03aTraits.pdf

+0

おかげで、それは確かにクラスがトレイトのメソッドをオーバーライドすることができますが、それは別の署名とそれをオーバーライドすることができる理由は言っていないと言うん! – Benjamin

+0

私の投稿を更新しました。 – Eugene

+0

私が知っているように、PHPの特性は、継承と同じ方法でメソッドをオーバーライドします。つまり、シグネチャチェックを行わず、メソッド名だけを意味します。 – Timur

関連する問題