1. 程式人生 > >PHP學習——29 PHP面向物件(trait特性的宣告與使用技巧:實現程式碼複用的類方法集合)

PHP學習——29 PHP面向物件(trait特性的宣告與使用技巧:實現程式碼複用的類方法集合)

自 PHP 5.4.0 起,PHP 實現了一種程式碼複用的方法,稱為 trait。

Trait 是為類似 PHP 的單繼承語言而準備的一種程式碼複用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中複用 method。Trait 和 Class 組合的語義定義了一種減少複雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題。

Trait 和 Class 相似,但僅僅旨在用細粒度和一致的方式來組合功能。 無法通過 trait 自身來例項化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承。

<?php 
// 1.建立一個trait類CodeSet1
trait CodeSet1
{
	public $name = '我在學PHP';//trait類中可以有屬性,不能有常量
	public function hello1()
	{
		return 'CodeSet1::hello1()';
	}
	public function do()
	{
		return 'CodeSet1::do()';
	}
}

// 2.建立一個trait類CodeSet2
trait CodeSet2
{
	// 3.1 匯入CodeSet1的程式碼
	// use CodeSet1;
	public function hello2()
	{
		return 'CodeSet2::hello2()';
	}
	public function do()
	{
		return 'CodeSet2::do()';
	}
}
// 4.建立一個父類類Demo2
class Demo2
{
	public function hello2()
	{
		return '父類Demo2::hello2()';
	}
}
// 3.建立一個類Demo1
class Demo1 extends Demo2
{
	use CodeSet1,CodeSet2{
		CodeSet1::do insteadof CodeSet2;
		CodeSet2::do as codeSet2Do;
	}
	// 3.1 只匯入CodeSet2
	// use CodeSet2;
	// 同一類中,同名方法的訪問優先順序:子類>trait類>父類
	public function hello2()
	{
		return '子類Demo2::hello2()';
	}
}
$demo1 = new Demo1();
echo $demo1->hello1(); // CodeSet1::hello1()
echo '<hr>';
echo $demo1->name; // 我在學PHP
echo '<hr>';
// echo $demo1->hello2(); // CodeSet2::hello2()
// 5.增加子類方法hello2
echo $demo1->hello2(); // 子類Demo2::hello2()
// 總結:同一類中,同名方法的訪問優先順序:子類>trait類>父類
echo '<hr>';
// 6.trait類中的方法重名時使用別名
// CodeSet1和CodeSet2新增方法do,註釋CodeSet2和Demo1中的語句:use CodeSet1;
echo $demo1->do();//CodeSet1::do()
echo '<hr>';
echo $demo1->codeSet2Do();//codeSet2Do是CodeSet2::do的別名
// CodeSet2::do()
?>