トレイトについて

2021/12/19

Laravelでは認証系のメソッドはほぼトレイトとして実装されています。

<?php

namespace Illuminate\Foundation\Auth;

trait AuthenticatesAndRegistersUsers
{
  use AuthenticatesUsers, RegistersUsers {
  AuthenticatesUsers::redirectPath insteadof RegistersUsers;
  AuthenticatesUsers::getGuard insteadof RegistersUsers;
  }
}

このようにLaravelのソースを読み込んでいくためにはPHPの「トレイト」を理解する必要があります。

今回はPHPのトレイトについてのエントリーです。

 

トレイトについて

PHPではクラスの多重継承はできません。

例えば、クラスTestAとクラスTestBを作成してそれら二つを継承するクラスTestCを書くとします。

<?php
class TestC extends TestA,TestB {
...
}
?>

これはエラーになります。

しかしPHP5.4からトレイトという仕組みができました。

クラスをトレイトに置き換えることで多重継承ができるようになります。

TestAとTestBのクラスをトレイトに置きかえ、TestCで多重継承してみます。

<?php
trait TestA
{
  function get_text1()
  {
  echo "トレイトTestA:get_text1メソッド コール成功!<br>";
  }
}

trait TestB
{
  function get_text2()
  {
  echo "トレイトTestB:get_text2メソッド コール成功!<br>";
  }
}

class TestC
{
  use TestA,TestB; //多重継承
  function get_text3()
  {
  echo "クラスTestC:get_text3メソッド コール成功!";
  }
}
【解説】
クラスTestCのように、トレイトを使った多重継承をする場合はuseを使ってカンマ区切りで追加していきます。

TestCのインスタンスを生成して継承元のメソッドをコールしてみます。

$display = new TestC();
$display->get_text1();
$display->get_text2();
$display->get_text3();

実行結果は以下になります。

継承元のトレイトTestAのメソッドとトレイトTestBのメソッドを呼び出すことができました。

多重継承は成功です。

【注意】
トレイト自体のインスタンスは出来ません。
つまりトレイトTestAやトレイトTestBを単独で使用することは出来ません。

 

Laravelでの使用例

CommonModelというモデルを作成し共通処理を記述。

各モデル(TestModel1.php、TestModel2.php)はCommonModelを継承する場合

<?php

trait CommonModel {

  // 共通処理

}
class TestModel1 extends Eloquent {

  use CommonModel;

}
class TestModel2 extends Eloquent {

  use CommonModel;

}

このようにトレイトを使うことで多重継承ができるのでCommonModel.phpのクラスに依存しなくても済むようになります。

 
以上です。

PHP おススメ教材(by Udemy)

 

本庄マサノリ

仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら

>> Twitter をフォローする

 

-周辺知識