2013-08-27 2 views
5

PHP 5.4.9では、次の例では、致命的なエラーがトリガーされます"Bは特性に由来するコンストラクタの定義に衝突しています"です。形質からコンストラクタの定義をどのように衝突させることができますか?

trait T { 
    public function __construct() { 
     echo __CLASS__ . ": constructor called.\n"; 
    } 
} 

class A { 
    use T; 
} 

class B extends A { 
    use T; 
} 

形質は、コンストラクタとは異なる方法、およびコンストラクタが実際のクラス(の特性を使用せず、「言語支援コピー&ペースト」機能)にコピーされていない問題が含まれている問題はありません。

ここでコンストラクタはとても特別ですか? PHPのうちの1つが他のものを上書きすることをPHPが理解できないようにすべきですか?この制限については何も見つかりませんでしたin the manual

This related questionには、(特性メソッドのエイリアスを使用して)問題を回避する方法が記載されていますが、最初に何が原因であるかはわかりません。

答えて

3

次のコードで何が起こるか試してみてください。これはあなたが特性Tを使用する必要がある場合は、効果的にAから延びて、その後B.

のために再びTを使用して書いたものですので

class A { 
    use T; 
    use T; 
} 

ベースクラスおよびサブクラスは、ベースクラスでのみ使用します。

サブクラスでのみ必要な場合は、リーフサブクラスでのみ使用してください。

+0

この場合、別のエラーメッセージが表示されます。*「Aの*の他の特性メソッドとの衝突があるため、特性メソッド__constructが適用されていません。また、インポートされたメソッドがコンストラクタであるかどうかは違いありません。問題の例は、他のメソッドでうまく動作しますが、コンストラクターの動作が異なるだけです。 – Zilk

+0

@hakreしかし、別の方法がうまく機能するように見える理由は説明しません。それは? – SteAp

+0

@ Zilk:* extends *ステップが欠落しているので、エラーには異なる名前が付けられますが、どちらのエラーでも衝突が通知されます。他の*メソッドについては、他の* magic *メソッドも試してみてください。私はそれらをエイリアスすることができないので、それらにいくつかの違いがあると想像することができます。彼らは変更することができない彼らの名前に依存しているので、エイリアシングはないので、衝突の再開はないので、衝突のみです。 – hakre

関連する問題