複数のトレイト

概要

1つのクラスに複数のトレイトを組み込むことが可能、しかし名前が重複するとエラーとなるらしい


2つのトレイトを組み合わせ

ソース

<?php
	/********************************
	 * トレイトの確認
	 ********************************/
 
	// トレイトの定義
	trait TestTrait01{
		// トレイト内部でメソッドの定義
		public function test01(){
			echo " traitTest1 ";
		}
	}
 
	// トレイトの定義
	trait TestTrait02{
		// トレイト内部でメソッドの定義
		public function test02(){
			echo " traitTest2 ";
		}
	}
 
	// クラスの定義
	class TestClass01{
		use TestTrait01, TestTrait02;
 
	}
 
	/*******************************
	 * クラスを生成して実行
	 *******************************/
	$obj = new TestClass01();
	$obj->test01();
	$obj->test02();
	echo "\n";
 
 
 

結果

>php -f sample04.php
 traitTest1  traitTest2
 
>
 

重複する名前で定義

ソース

<?php
	/********************************
	 * トレイトの確認
	 ********************************/
 
	// トレイトの定義
	trait TestTrait01{
		// トレイト内部でメソッドの定義
		public function test02(){
			echo " traitTest1 ";
		}
	}
 
	// トレイトの定義
	trait TestTrait02{
		// トレイト内部でメソッドの定義
		public function test02(){
			echo " traitTest2 ";
		}
	}
 
	// クラスの定義
	class TestClass01{
		use TestTrait01, TestTrait02;
 
	}
 
	/*******************************
	 * クラスを生成して実行
	 *******************************/
	$obj = new TestClass01();
	$obj->test02();
	echo "\n";
 
 
 

結果

>php -f sample05.php
 
Fatal error: Trait method test02 has not been applied, because there are collisions with other trait methods on TestClass01 in D:\Tools\xampp\htdocs\sample\sample05.php on line 26
 
>
 

2つのトレイトのメソッドが重複する場合は優先するメソッドを定義

ソース

<?php
	/********************************
	 * トレイトの確認
	 ********************************/
 
	// トレイトの定義
	trait TestTrait01{
		// トレイト内部でメソッドの定義
		public function test02(){
			echo " traitTest1 ";
		}
	}
 
	// トレイトの定義
	trait TestTrait02{
		// トレイト内部でメソッドの定義
		public function test02(){
			echo " traitTest2 ";
		}
	}
 
	// クラスの定義
	class TestClass01{
		// メソッド名が重複する場合に優先するメソッドを使用
		use TestTrait01, TestTrait02{
			TestTrait01::test02 insteadof TestTrait02;	// TestTrait01のメソッドを使用
		}
 
	}
	// クラスの定義
	class TestClass02{
		// メソッド名が重複する場合に優先するメソッドを使用
		use TestTrait01, TestTrait02{
			TestTrait02::test02 insteadof TestTrait01;	// TestTrait02のメソッドを使用
		}
 
	}
 
	/*******************************
	 * クラスを生成して実行
	 *******************************/
	$obj = new TestClass01();
	$obj->test02();
	echo "\n";
 
	 $obj = new TestClass02();
	$obj->test02();
	echo "\n";
 
 
 

結果

>php -f sample06.php
 traitTest1
 traitTest2
 
>
 

2つのトレイトでメソッド名を別名に変更

ソース

<?php
	/********************************
	 * トレイトの確認
	 ********************************/
 
	// トレイトの定義
	trait TestTrait01{
		// トレイト内部でメソッドの定義
		public function test02(){
			echo " traitTest1 ";
		}
	}
 
	// トレイトの定義
	trait TestTrait02{
		// トレイト内部でメソッドの定義
		public function test02(){
			echo " traitTest2 ";
		}
	}
 
	// クラスの定義
	class TestClass01{
		// メソッド名が重複する場合に優先するメソッドを使用
		use TestTrait01, TestTrait02{
			TestTrait01::test02 insteadof TestTrait02;	// TestTrait01のメソッドを使用
			TestTrait02::test02 as test02B;				// TestTrait02のtest02メソッドを変更
		}
 
	}
 
	/*******************************
	 * クラスを生成して実行
	 *******************************/
	$obj = new TestClass01();
	$obj->test02();
	$obj->test02B();
	echo "\n";
 
 
 

結果

>php -f sample07.php
 traitTest1  traitTest2
 
>
 




最終更新:2012年11月24日 23:08