2016-03-28 32 views
1

Her biri aynı ada sahip bir yönteme sahip bir özellik ve bir sınıf var, ancak sınıfın yöntemi statik ve trait yöntemi değil. Her ikisi de bu sınıftan miras alan ve özelliği kullanan bir sınıf tanımlamak mümkün mü?Kalıtsal bir statik yöntemle çakışan statik olmayan bir yöntemle nasıl bir özellik kullanıyorsunuz?

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; 
} 

İlk düşünce gibi

kodunda, bu olmazdı şey

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

gibi, nitelik üzerinde yöntemini diğer ad ama özellik hala geçersiz çalışıyor görünüyor yönteminden yola çıkılarak, bu bir hata atar. Bu nedenle, bu hata yapmaya çalıştığım şey midir? Öyleyse nasıl? Ve değilse, lütfen neden olmadığını açıklayınız. Teşekkürler! sınıf ve sürekli hem uygulamanın diğer kısımlarına çevresinde oldukça yaygın olarak kullanılmaktadır beri

DÜZENLEME
Maalesef yöntem adlarını değiştirme, benim için uygun bir seçenek değildir. the PHP docs'a göre, trait'in yöntemleri her zaman miras alınan yöntemleri geçersiz kılar. (Statik olmayan olmak için ParentClass::doStuff'u değiştirirseniz bunu iş başında görebilirsiniz, ancak bu, her ikisini de yapabildiğim bir şey değildir.) Belki de sorduğum şey gerçekten miras yöntemini yapamaz mı, yoksa devralınmıştır statik yöntem (normal davranış gibi görünüyor)?

Ayrıca MyTrait::doStuff ile doOtherStuff arasındaki takma adların ve bunun yerine kullanan ikinci bir özellik oluşturuyorum.

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

class ChildClass extends ParentClass 
{ 
    use MyTrait2; 
} 

Ancak bu, garip bulduğum aynı hatayı üretir.

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

cevap

0

Muhtemelen bir yanlış anlama. Statik yöntemler ve durağan olmayanlar aynı işi yapmamalı, bu yüzden farklı isimlere sahip olmalı, Belki isminiz yeterince açık değil.

Bir takma ad oluşturduğunuzda, hem eski ad hem de yeni ad bulunduğundan, bunu yapamazsınız. "DoStuff" hala mevcut olduğu için, ParentClass ile bir çakışma oluşturur.

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

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

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

Hakkı:

bu örneğe bakın. Buradaki düşüncelerinize katılıyorum ve sınıfın yöntemi statik değilse, bu özellik onu geçersiz kılar. Ancak, yöntem adlarını değiştirmek benim için uygun bir seçenek değildir. Üst sınıf ve özellik, birlikte çalıştığım uygulama boyunca yaygın olarak kullanılır, bu nedenle ya değişen bir girişim olabilir. –