忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/03/27 21:39 |
PHP5.4.7 トレイト
PHP5.4でtraitという機能が追加されています。

クラスAをextendsしてるけど、ここに追加でクラスBとクラスCもextendsしたい、そんな要求を概ね叶えてくれる機能です。
<?php
	// 基底クラス
	class A{
		public function hoge(){
			print('クラスAのメソッドhoge');
		}
	}

	// trait
	trait B{
		public function hoge(){
			print('トレイトBのメソッドhoge');
		}
		public function fuga(){
			print('トレイトBのメソッドfuga');
		}
		public function foo(){
			print('トレイトBのメソッドfoo');
		}
	}

	trait C{
		public function fuga(){
			print('トレイトCのメソッドfuga');
		}
		
		private $int = 1; // プロパティ
	}

	// Aを継承したクラス
	class D extends A{
		// トレイトB,Cを使用
		use B, C{
			// 被っているメソッドfugaはBを使用
			B::fuga insteadof C;
		}
		
		// @Override
		public function foo(){
			print('クラスDのメソッドfoo');
		}
		
		// トレイトのprivateを参照可能
		public function getInt(){
			print($this->int);
		}
	}
		
		// 優先順位は自分自身 > trait > 基底クラス
		$d = new D();
		$d->hoge(); // トレイトBのメソッドhoge
		$d->fuga(); // トレイトBのメソッドfuga
		$d->foo();  // クラスDのメソッドfoo
		$d->getInt(); // 1
interfaceではメソッドの定義しか行えずロジックは書けませんでした。
クラスとはひとつしかextendsできないため、extends A, B, Cができませんでした。
トレイトを使うことによってこれらの問題点を解消し、ロジックを書いたうえで複数extendsのようなことを行うことができるようになります。

トレイト内のprivateな値も参照できていることから、普通のextendsより強い結びつきということがわかります。
実際はもっと単純に、useしたtraitは全部合わせてひとつのクラスと看做すと考えればよいでしょう。
要するにもうPartial classってことでいいよね。


PR


2013/06/21 23:37 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2013/06/23 | HOME | AuraPHP 1.0.1 Aura.Http>>
忍者ブログ[PR]