traitの使われるクラスの変数にtraitの依存がなく、可読性が高いように思われるのですが
この部分がよくわからないのですが、こういう意味でしょうか?
lang
1trait Hoge {
2 public function fuga() {
3 return $this->hage;
4 }
5}
このような例は絶対に避けるべきだと思います、トレイトを使うことによって暗黙的な依存が生まれてしまっています(use する側のクラスの $hage
プロパティに暗黙のうちに依存している)。
①多重ではない継承でも積極的に使いたい
②多重継承の場合のみ、使いたい
③使うべきではない。
トレイトを上手く使うパターンが自分の中でまだ出来上がっていないので、今のところインタフェースの部分実装のためにしか使っていません。なので、2と3の間です。
例えば次のような使い方です。
lang
1interface HogeInterface {
2 public function fuga();
3 public function hage();
4}
5
6// HogeInterface の部分的な実装をフレームワークやライブラリが提供
7trait HogeTrait {
8 public function fuga() {
9 // いろいろ
10 }
11 abstract public function hage();
12}
13
14// PHP 5.4 以前は抽象クラスだった
15abstract class AbstractHoge {
16 public function fuga() {
17 // いろいろ
18 }
19 abstract public function hage();
20}
利用側で HogeInterface
インプリメントするときに HogeTrait
を use すればフレームワークやライブラリが意図した部分的な実装が適用され、利用側はインタフェースの一部だけ実装すればいいことになります。
PHP 5.4 以前では同じようなことを実現するために抽象クラスが使われていました。そのため、他のクラスから継承したクラスに HogeInterface
をインプリメントしようとすると、HogeInterface
の全てを自分で実装する必要がありました。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。