それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

trait で関数名が衝突した場合。名前かぶりを別名にする。

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の関係を辿る必要がある。