【新卒 / 中途採用】サーバー / クラウドエンジニア 募集中!【大阪】

【新卒 / 中途採用】サーバー / クラウドエンジニア 募集中!【大阪】

【導入実績300社以上】AWS 構築・運用保守サービス

【導入実績300社以上】AWS 構築・運用保守サービス

【ECサイト構築】Shopify カスタムアプリ開発サービス

【ECサイト構築】Shopify カスタムアプリ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【音声アプリ開発】Twilio アプリ開発サービス

【音声アプリ開発】Twilio アプリ開発サービス

【システム開発サービス】SAKARAKU Lab(セカラクラボ)| Webシステム開発

【システム開発サービス】SAKARAKU Lab(セカラクラボ)| Webシステム開発

【取材記事】サーバー系企業ビヨンドが サーバーサイドエンジニアを募集中

【取材記事】サーバー系企業ビヨンドが サーバーサイドエンジニアを募集中

【対談記事】「やっぱクラウド移設っていいですよね」マイネット × ビヨンド エンジニア対談

【対談記事】「やっぱクラウド移設っていいですよね」マイネット × ビヨンド エンジニア対談

ビヨンド公式YouTubeチャンネル「びよまるチャンネル」

ビヨンド公式YouTubeチャンネル「びよまるチャンネル」

単一継承言語の救世主?? PHPのtraitについて解説!

PHP


お疲れ様です!
システム開発部の山田です。

今回は、PHP5.4.0から導入された、コードを再利用するために使用されるtraitについて解説していきます。

traitとは

traitはPHP5.4.0から導入され、単一継承言語でコードを再利用するための仕組みひとつです。
メソッド群を一つにまとめ、クラスの中で使用宣言を行うことで、継承を行わなくてもクラスメソッドとして使用することができる機能です。

何故traitが生まれたのか

PHPのclassには継承という仕組みがあります。
継承とは、既存のclassの内容を引き継ぎながら新しくclassを作成する仕組みです。

継承を行うことで、同一コードを記載する必要が無くなりますが、この継承は一つのclassに一つの継承しかできない仕様となっており、いくつかのメソッド群を色々なclassで使用したい場合は継承の関係が複雑になる事が多く、少し扱いにくい物となっておりました。

その問題の対処法の一つとしてtraitは誕生しました。
メソッド群をtraitとしてまとめ、class内でtraitの使用を宣言をするだけで使えるようにすることで、単一継承の仕組みで起こる複雑さを軽減させる事ができます。

使用方法

traitの作成方法

trait トレイト名 {

 public function メソッド名1() {
  処理
 }

 public function メソッド名2() {
  処理
 }
}

class内での使用方法

class クラス名 {

use 作成したtrait名;

// 以降class処理

}

実際のコードにて確認

実際にコードを記載して動くかを確認してみます。
確認内容としては以下とします。

  • 自身のクラスメソッドがきちんと動作するか
  • 継承元のクラスメソッドがきちんと動作するか
  • stateをクラス内で使用宣言した際に、きちんと動作するか

そのために、神になった気分で強い勇者を作ってみたいと思います。
設定は、人間を作る際は、名前と身長のみを定義し、勇者は人間の特性に加え、剣を振ることができる物とします。
そこに、「足が速くなる」「体が強くなる」といった身体強化の特性も付与し強い勇者を作成したいと考えます。
コードを記載する流れは以下となります。

  • 身体強化のstateを作成
  • 人間classを継承した勇者classを作成
  • 作成したstateを勇者classに継承し、実際に動くかを確認
 
trait EnhancedBody {

  public function fastRunner() { 
    echo '足が速くなる'; 
  }
 
  public function strongBody() {
    echo '体が強くなる'; 
  } 
}
 
class Human {
  public $name;
  public $height;

  public function __construct($name) {
    $this->name = $name;
    $this->height = rand(140, 190);
  }

  public function status() {
    echo "名前:{$this->name}、身長:{$this->;height}"; 
  }
}

class Swordsman extends Human {
  use EnhancedBody;

  public function swingTheSword() {
    echo "剣を振る"; 
  } 
} 

以上のコードを動かした結果を以下に記載

// 勇者classの作成
$taro = new Swordsman('taro');

// 人間classに定義されているメソッドの実行
$taro->status(); // 名前:taro、身長:150

// 勇者classに定義されているメソッドの実行
$taro->swingTheSword(); // 剣を振る

// 身体強化stateに記載さえているメソッドの実行
$taro->fastRunner(); // 足が速くなる
$taro->strongBody(); // 体が強くなる

以上より強い勇者を作ることができたため、classメソッド、継承元のclassメソッド、使用宣言したstateのメソッドを使用できることが分かります。

まとめ

今回は、単一継承言語でコードを再利用するための仕組みのひとつであるtraitについて解説してきました。
使う場面自体は限られた機能ではありますが、trait内でメソッドを記載し、使いたいclassにuse宣言をするだけで使用できるためコードの複雑性が減り、読みやすいコードになるため、ぜひ使ってみてください!


この記事をかいた人

About the author

山田雄貴

システム開発部所属の山田です。
ボードゲームが好きです。