2013-08-27 10 views
5

W PHP 5.4.9 poniższy przykład wyzwala błąd krytyczny: "B ma kolidujące definicje konstruktorów pochodzące z cech".W jaki sposób można kolidować definicje konstruktów ze znaków?

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

class A { 
    use T; 
} 

class B extends A { 
    use T; 
} 

Nie ma problemu, gdy cecha zawiera inną metodę niż konstruktora, a nie problemem, gdy konstruktor jest faktycznie kopiowane do klas (bez użycia cech, „kopię język wspomagane & pasta” Feature).

Co jest takiego specjalnego w konstruktorze? Czy PHP nie powinno być w stanie dowiedzieć się, że jedna z nich przesłania drugą? Nie mogłem znaleźć nic na temat tego ograniczenia in the manual.

This related question wspomina o sposobie obejścia problemu (przy użyciu aliasów dla metod cech), ale nie o to, co jest przyczyną tego problemu.

Odpowiedz

3

Spróbuj, co dzieje się z następującego kodu:

class A { 
    use T; 
    use T; 
} 

Bo to jest to, co faktycznie napisałem przez rozciągającą się od A, a następnie za pomocą T ponownie B.

Jeśli trzeba użyć cecha T w baza i podklasy, używaj jej tylko w klasie bazowej.

Jeśli potrzebujesz go tylko w podklasach, używaj go tylko w podklasach liści.

+0

Otrzymuję inny komunikat o błędzie w tym przypadku: * "Metoda cech __construct nie została zastosowana, ponieważ w A występują kolizje z innymi metodami. Nie ma również znaczenia, czy importowana metoda jest konstruktorem czy nie. Przykład w pytaniu działa dobrze z innymi metodami, tylko konstruktor zachowuje się inaczej. – Zilk

+0

@hakre Ale nie wyjaśnia, dlaczego inna metoda wydaje się działać dobrze. Czy to? – SteAp

+0

@Zilk: Błąd jest inaczej nazwany, ponieważ brak * kroku *, ale oba błędy informują o kolizji. Dla * innych * metod, spróbuj także z innymi * magicznymi * metodami. Mogę sobie wyobrazić, że będzie jakaś różnica dla tych, ponieważ nie możesz ich pseudonimu. Są zależne od ich nazwy, która nie może się zmienić, więc nie ma aliasingu, więc nie ma odpowiedzi na konflikt, więc tylko kolizja. – hakre

Powiązane problemy