trait を use するときに名前がかぶった。
同じ名前の関数・変数があって、名前が衝突してエラーになる。
対応するには、use を使うか、優先順位を変える。
名前の衝突する trait の例
次の例では say()
が衝突してしまう。
<?php trait A { public function say () { echo "I'm A\n"; } } trait B { public function say () { echo "I'm B\n"; } }
use の中で衝突を回避する。
A::say insteadof B
を書けば無事に動作する。
<?php class MyUSer { use A, B{ // A::say insteadof B::say の意味。B::say が冗長なので省略されている。初見殺し。 A::say insteadof B; B::say as b_say; } } $u = new MyUSer(); $u->say(); $u->b_say(); ?>
instead of は英語で、代替するという意味になる。なので、このUse句は、次のような意味だとわかる。
use A::say insteadof B::say
これはあまりに冗長なので、
use A,B{ A::say insteadof B }
と表現しているのでしょう。
別解、上書き。
B::say が不要なのであれば、Trait中でTraitを上書きしてまえば良い。
<?php trait A { use B public function say () { echo "I'm A\n"; } } trait B { public function say () { echo "I'm B\n"; } }
こうすれば、上書きで解決する。意外とスッキリするのでこの方法もありかもしれない。
ただし、Reflection時にgetTraitできなくなるので、Traitの関係を辿る必要がある。