オブジェクト指向~トレイト~

PHPのシンタックス

  1. HOME
  2. OOPトレイト

オブジェクト指向~トレイト~

クラス継承では親クラスを1個しか指定できませんが、トレイトでは複数のトレイトを指定してコードを活用できる。

トレイトの定義
trait トレイト名 {
 //トレイトのプロパティ
 //トレイトのメソッド
}
親クラスを指定したトレイトの定義
trait トレイト名 extends 親クラス {
 //トレイトのプロパティ
 //トレイトのメソッド
}

2つの関数があるDateトレイト

<?php
trait Date
{
  public function ymdString($date)
  { //DateTimeを年月日の書式で返す
    $dateString = $date->format('y年m月d日');
    return $dateString;
  }
  public function addymdString($date, $days)
  { //指定日数後の年月日で返す
    $date->add(new DateInterval("P{$days}D"));
    return $this->ymdString($date);
  }
}

トレイトの使い方

トレイトを利用するには、useキーワードを指定します。同時に振K数のトレイトを指定して利用できます。

class クラス名 {
 use トレイト名 , トレイト名 , ...;
 //クラスのコード
}

トレイトを利用したDeliveryDateクラス

<?php
require_once("Date.php");

class DeliveryDate
{
  use Date;
  public $theDate;
  public $limitDate;

  function __construct()
  {
    $now = new DateTime(); //今日の日付
    $this->theDate = $this->ymdString($now); //年月日の書式へ
    $this->limitDate = $this->addymdString($now, 20); //20日後の日付
  }
}
?>

DeliveryDateクラスのインスタンスを使って2つのプロパティを出す

受注した日:24年04月27日
納入期限日:24年05月17日
<?php
require_once("DeliveryDate.php");

$work = new DeliveryDate();
echo "受注した日:" . $work->theDate . "\n";
echo "納入期限日:" . $work->limitDate;
?>

メソッドの衝突を解決する

複数のトレイトを使うと同じ名前でメソッドが定義されていることがあります。
トレイトのメソッド指定方法を解説

2つのトレイトの同名メソッドhello()

<?php
trait Momotaro
{
  public function hello()
  {
    echo "こんにちは!桃太郎だよ!";
  }

  public function weekday()
  {
    $week = ["日", "月", "火", "水", "木", "金", "土",];
    $now = new DateTime();
    $w = (int)$now->format("w");
    $weekday = $week[$w];
    echo "今日は" . $weekday . "曜日です。";
  }
}
<?php
trait Orihime
{
  public function hello()
  {
    echo "こんにちは!織姫です。本日も1日頑張ろう!";
  }
}


insteadofキーワードとasキーワード

<?php
require_once("Momotaro.php");
require_once("Orihime.php");

class Instead
{
  use Momotaro, Orihime {
    Momotaro::hello as Momohello;
    Orihime::hello insteadof Momotaro;
  }
}

insteadofキーワード
「Bの代わりにA」という用途で使用します。

use トレイト名 , トレイト名 ,... {
 Aトレイト::メソッド名 insteadof Bトレイト;
}

asキーワード
メソッドに別名を付ける用途で使用します。

use トレイト名 , トレイト名 ,... {
  トレイト名::メソッド名 as 別のメソッド名;
}

helloメソッドの実行結果

こんにちは!織姫です。本日も1日頑張ろう!
今日は土曜日です。
<?php
require_once("Instead.php");

$myhello = new Instead();
$myhello->hello();
echo "\n";
$myhello->weekday();
?>

別名呼び出しの実行結果

こんにちは!織姫です。本日も1日頑張ろう!
こんにちは!桃太郎だよ!
<?php
require_once("Instead.php");

$myhello = new Instead();
$myhello->hello(); //hello()を読んだとき
echo "\n";
$myhello->Momohello(); //別名付けた呼び出し
?>