PHP5.4でtraitという機能が追加されています。
クラスAをextendsしてるけど、ここに追加でクラスBとクラスCもextendsしたい、そんな要求を概ね叶えてくれる機能です。
クラスとはひとつしかextendsできないため、extends A, B, Cができませんでした。
トレイトを使うことによってこれらの問題点を解消し、ロジックを書いたうえで複数extendsのようなことを行うことができるようになります。
トレイト内のprivateな値も参照できていることから、普通のextendsより強い結びつきということがわかります。
実際はもっと単純に、useしたtraitは全部合わせてひとつのクラスと看做すと考えればよいでしょう。
要するにもうPartial classってことでいいよね。
クラスAをextendsしてるけど、ここに追加でクラスBとクラスCもextendsしたい、そんな要求を概ね叶えてくれる機能です。
<?php // 基底クラス class A{ public function hoge(){ print('クラスAのメソッドhoge'); } } // trait trait B{ public function hoge(){ print('トレイトBのメソッドhoge'); } public function fuga(){ print('トレイトBのメソッドfuga'); } public function foo(){ print('トレイトBのメソッドfoo'); } } trait C{ public function fuga(){ print('トレイトCのメソッドfuga'); } private $int = 1; // プロパティ } // Aを継承したクラス class D extends A{ // トレイトB,Cを使用 use B, C{ // 被っているメソッドfugaはBを使用 B::fuga insteadof C; } // @Override public function foo(){ print('クラスDのメソッドfoo'); } // トレイトのprivateを参照可能 public function getInt(){ print($this->int); } } // 優先順位は自分自身 > trait > 基底クラス $d = new D(); $d->hoge(); // トレイトBのメソッドhoge $d->fuga(); // トレイトBのメソッドfuga $d->foo(); // クラスDのメソッドfoo $d->getInt(); // 1interfaceではメソッドの定義しか行えずロジックは書けませんでした。
クラスとはひとつしかextendsできないため、extends A, B, Cができませんでした。
トレイトを使うことによってこれらの問題点を解消し、ロジックを書いたうえで複数extendsのようなことを行うことができるようになります。
トレイト内のprivateな値も参照できていることから、普通のextendsより強い結びつきということがわかります。
実際はもっと単純に、useしたtraitは全部合わせてひとつのクラスと看做すと考えればよいでしょう。
要するにもうPartial classってことでいいよね。
PR