#PHP 類的多繼承實現之 traits.md

TRAIT

PHP本身是並不支持多繼承的,也就是,一個類只能繼承一個類,為了滿足業務需求,後來有了一些解決方法,例如,鏈式繼承,B繼承A,然後C繼承B,這樣,C就同時繼承了AB, 此外還有接口,因為接口其實和抽象類很像,同一個類可以實現多個接口,利用接口的此特性,我們也能實現多繼承。

但是,自 PHP 5.4.0 起,PHP 實現了代碼復用的一個方法,稱為 Traits,它能夠幫我們更加便捷的實現類的多繼承。

實例1

<?php
trait A{
	public function testA(){
		echo "<br>";
		echo "testA call";
	}
}
trait B{
	public function testB(){
		echo "<br>";		
		echo "testB call";
	}
}
trait C{
	public function testC(){
		echo "<br>";		
		echo "testC call";
	}
}
class D{
	use A,B,C;
}

$cls = new D();
$cls->testA();
$cls->testB();
$cls->testC();
?>
#輸出

testA call
testB call
testC call

實例2

<?php
class E{
	public function testE(){
		echo "<br>";
		echo "testE call";
	}
}
trait F{
	public function testF(){
		echo "<br>";
		echo "testF call";
	}	
}
class G extends E{
	use F;
}
$cls = new G();
$cls->testE();
$cls->testF();
?>
#輸出

testE call
testF call

實例3

<?php
class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}
 
trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}
 
class MyHelloWorld extends Base {
    use SayWorld;
}
 
$o = new MyHelloWorld();
$o->sayHello();
?>

以上例程會輸出:

Hello World!

 trait 有一個魔術常量,__TRAIT__,用於在相應trait中打印當前trait的名稱。

Tags: