PHPのtrait。まだ使いこなせません。
例えばtraitでメンバー変数を扱うことが出来ます。
trait HelloTrait {
protected $hello = 'hello trait';
function hello() {
echo $this->hello;
}
}
ただ、この$hello
のメンバー変数をクラスと共有しようとすると面倒です。
クラスで設定したメンバー変数の値を表示する場合です。
class Hello {
use HelloTrait;
protected $hello = 'hello class';
}
echo (new Hello)->hello();
上のコードはFatalエラーを発生します(するはず。実は走らせてない…)。クラスとtraitで同じメンバー変数がありますが、値が違うからです。同じにしてもE_STRICTエラーが発生します。
ならば、traitのprotected $hello
を削除すればエラーがなくなりますが、traitで使っているメンバー変数が存在しないので、変です。それに$hello
を持たないクラスで使うとエラーが出るかもしれません。
そんな時はgetter関数を使います。
例えばfunction getHello()
。
更にtrait内でabstractメソッドを指定してあげると使い勝手が上がります。
trait HelloTrait {
abstract protected function getHello();
function hello() {
echo $this->getHello();
}
}
class Hello {
use HelloTrait;
protected $hello = 'hello class';
protected function getHello() {
return $this->hello;
}
}
クラス側でgetHelloメソッド
を持たないクラスでHelloTrait
を使うと、すぐエラーがでて問題が分かります。
値を変えるときは、同じようにsetterメソッドを追加します。
参考:http://www.slideshare.net/mikestowe/traits-and-horizonal-design