Trait 是 PHP5.4 中的新特性,是 PHP 多重继承的一种解决方案。例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情,Trait 就是为了解决这个问题。
基本使用方法
trait first_trait {
function first_method() {
/* Code Here */
echo "first_method<BR><BR>";
}
function second_method() {
/* Code Here */
echo "second_method<BR><BR>";
}
}
class first_class {
// 注意这行,声明使用 first_trait
use first_trait;
}
$obj = new first_class();
// Executing the method from trait
$obj->first_method(); // valid
$obj->second_method(); // valid
使用多个 Trait
trait first_trait{
public function first_method(){
echo "first_method<BR>";
}
}
trait second_trait{
public function second_method(){
echo "second_method<BR>";
}
}
//在同个 Class 中可以使用多个 Trait
class first_class {
use first_trait, second_trait;
}
$class = new first_class();
$class->first_method();
$class->second_method();
Trait 之间的嵌套
trait first_trait{
public function first_method(){
echo "first_method<BR>";
}
}
trait second_trait{
use first_trait;
public function second_method(){
echo "second_method<BR>";
}
}
class first_class {
use second_trait;
}
//Trait 之间的嵌套
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method1
// Valid
$obj->second_method(); // Print : method2
Trait 的抽象方法(Abstract Method)
trait first_trait{
public function first_method(){
echo "first_method<BR>";
}
}
trait second_trait{
use first_trait;
public function second_method(){
echo "second_method<BR>";
}
abstract public function getName();
}
class first_class {
use second_trait;
public function getName(){
return "first_class.getName";
}
}
//Trait 之间的嵌套
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method1
// Valid
$obj->second_method(); // Print : method2
echo $obj->getName();
Trait 冲突
trait first_trait{
public function first_method(){
echo "first_method<BR>";
}
public function test(){
echo "first_trait.test<BR>";
}
}
trait second_trait{
public function second_method(){
echo "second_method<BR>";
}
public function test(){
echo "first_trait.test<BR>";
}
abstract public function getName();
}
class first_class {
use first_trait, second_trait{
// 在这里声明使用 first_trait 的 test 替换
// second_trait 中声明的
first_trait::test insteadof second_trait;
}
public function getName(){
return "first_class.getName";
}
//Trait 冲突
}
$obj= new first_class();
// Valid
$obj->first_method(); // Print : method1
// Valid
$obj->second_method(); // Print : method2
echo $obj->getName();
$obj->test();