2016-03-28 6 views
1

私は、それぞれが同じ名前のメソッドを持っているが、そのクラスのメソッドは静的であり、その特性のメソッドではないという特性とクラスを持っているとします。このクラスから継承し、その特性を使用するクラスを定義することは可能ですか?継承された静的メソッドと競合する非静的メソッドを持つ形質をどのように使用しますか?

trait MyTrait 
{ 
    public function doStuff() 
    { 
     return 'trait'; 
    } 
} 

class ParentClass 
{ 
    public static function doStuff() 
    { 
     return 'parent'; 
    } 
} 

class ChildClass extends ParentClass // I'm feeling really original today apparently 
{ 
    use MyTrait; 
} 

私の最初の考えのような

のコードでは、これは見て何かが

class ChildClass extends ParentClass 
{ 
    use MyTrait { 
     doStuff as doOtherStuff; 
    } 
} 

のように、特性の方法をエイリアスすることでしたが、形質がまだ上書きしようとしているようですメソッドを親クラスから呼び出すと、エラーがスローされます

Cannot make static method ParentClass::doStuff() non static in class MyTrait 

私がしようとしていることは可能ですか?もしそうなら、どうですか?そうでない場合は、理由を説明してください。ありがとう!クラスと特性の両方がアプリケーションの他の部分の周りにはかなり広く使用されているので、

EDIT
は残念ながら、メソッド名を変更することは、私のために実行可能な選択肢ではありません。 the PHP docsによれば、特性のメソッドは常に継承されたメソッドをオーバーライドします。 (実際にはParentClass::doStuffを非静的に変更するとこれを見ることができますが、実現可能なことではありません)。静的メソッド(通常の動作と思われる)?

また、別名MyTrait::doStuffdoOtherStuffという別名を作成し、その代わりに使用します。

trait MyTrait2 
{ 
    use MyTrait { 
     doStuff as doOtherStuff; 
    } 
} 

class ChildClass extends ParentClass 
{ 
    use MyTrait2; 
} 

しかし、これは同じエラーが発生しますが、これは奇妙です。

Cannot make static method ParentClass::doStuff() non static in class MyTrait2 

答えて

0

おそらく誤解されています。静的メソッドと非静的メソッドは同じ種類の作業を行うべきではないので、異なる名前を持たなければなりません。あなたの名前は十分に明示的ではないかもしれません。

エイリアスを作成すると、古い名前と新しい名前の両方が存在するため、作成できません。したがって、 "doStuff"がまだ存在するので、ParentClassと競合が発生します。

trait MyTrait 
{ 
    public function doStuff() 
    { 
     return 'foo'; 
    } 
} 

class Foo 
{ 
    use MyTrait { 
     doStuff as doOtherStuff; 
    } 
} 

echo Foo::doStuff(); // doStuff still works 
+0

右:

は、この例を参照してください。私はここであなたの考えに同意し、クラスのメソッドが静的でない場合、その特性がそれをオーバーライドすることがわかりました。しかし、メソッド名を変更することは私にとって実行可能な選択肢ではありません。親クラスと特性はどちらも私が作業しているアプリ全体で広く使用されているので、いずれかを変更することは辛い取り組みになります。 –

関連する問題