技術はあとからついてくる。

就活開始の半年前にエンジニアに目覚めた人

【PHP】Traitってなんだ

Laravelで開発するチームにジョインしてTraitという名前を多く見るようになった。
一体何者なのかあまり勉強せずに流してきてしまったので、ここで一度I/Oします。

クラスの多重継承

PHPではクラスの多重継承はできない。
例えば、クラスSampleAとクラスSampleBを作成してそれら二つを継承するクラスSampleCは

// エラー
<?php
class SampleC extends SampleA,SampleB {
...
}
?>

と書けるが、これはエラーになる。
しかし、PHP5.4からできたトレイト(Trait)という仕組みを利用して
クラスをトレイトに置き換えることで多重継承ができるようになる。

Traitに置き換え

SampleAとSampleBのクラスをトレイトに置きかえ、SampleCで多重継承する例。

SampleTrait.php

<?php
trait SampleA
{
  function get_text1()
  {
  echo "get_text1!";
  }
}
 
trait SampleB
{
  function get_text2()
  {
  echo "get_text2!";
  }
}
 
class SampleC
{
  use SampleA,SampleB; // useを使って多重継承
  function get_text3()
  {
  echo "get_text3!";
  }
}

これをもとにインスタンス化をすると

$display = new SampleC();
$display->get_text1(); // get_text1! 
$display->get_text2(); // get_text2!
$display->get_text3(); // get_text3!

注意点

トレイト自体のインスタンスは出来ない。 そのため、トレイトSampleAやトレイトSampleBを単独で使用することは出来ない。

// エラー
$display = new SampleB();

まとめ

  • トレイト(Trait)はPHP5.4から実装されたクラスを多重継承するための仕組みである。
  • クラスをトレイトに置き換えることで、そのトレイトをuseで継承できる。
  • トレイト自体のインスタンスはできないので注意