1. 程式人生 > >PHP-trait-筆記

PHP-trait-筆記

trait

trait是一種程式碼複用的方法,用於模擬實現多繼承(PHP是單繼承語言)

注意:

1.trait中的寫法和普通的類寫法一樣(不過一般我們只寫方法)

2.如果trait中的屬性與類中的屬性同名,則會報告錯誤

3.trait無法被new例項化

4.trait可以巢狀trait

原始碼:

<?php
	trait A
	{
		function go()
		{
			echo "Go<br />";
		}
	}

	trait B
	{
		use A;//巢狀trai A
		function ao()
		{
			echo "Ao<br />";
		}
	}

	class C
	{
		use B;//複用trait B的程式碼
	}

	$p = new C();
	$p->go();//呼叫複用的程式碼
	$p->ao();
?>

顯示:

Go Ao

解決方法同名問題:

關鍵字:insteadof 代替(instead of)            as 別名

原始碼:

<?php
	trait A
	{
		function go()
		{
			echo "去那<br />";
		}
	}

	trait B
	{
		function go()
		{
			echo "走呀<br />";//方法名與trait A中的重複
		}
	}

	class C
	{
		use A,B
		{
			A::go insteadof B;//trait A中的go()代替trait B中的go()
			B::go as goB;//將trait B中的go取個別名為goB
		}
		
	}

	$p = new C();
	$p->go();//呼叫的trait A中的go()方法
	$p->goB();//呼叫取別名的trait B的go()方法
?>

顯示:

去那 走呀

關於優先順序問題:

子類是先繼承父類,再使用trait複用程式碼,所以當繼承和trait同時使用的時候父類的成員方法與trait方法同名時會被trait方法重寫,但是我們可以通過parent解決這個問題

原始碼:

<?php
	class A
	{
		function Ton()
		{
			echo "你";
		}
	}

	trait B
	{
		function Ton()//該方法於class A中的Ton()方法同名
		{
			parent::Ton();//我們可以通過呼叫原來的方法來解決重寫問題
			echo "好";
		}
	}

	class C extends A
	{
		use B;
	}

	$p = new C();
	$p->Ton();
?>

顯示:

你好