<?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();
?>
多个 trait示例:通过逗号分隔,在 use 声明列出多个 trait,可以都插入到一个类中。
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World';
}
}
class MyHelloWorld {
use Hello, World;
public function sayExclamationMark() {
echo '!';
}
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
$o->sayExclamationMark();
?>
<?php
trait Hello {
public function sayHello() {
echo 'Hello ';
}
}
trait World {
public function sayWorld() {
echo 'World!';
}
}
trait HelloWorld {
use Hello, World;
}
class MyHelloWorld {
use HelloWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
?>
以上例程会输出:
Hello World!
trait中方法冲突问题示例:
<?php
trait firstTrait {
function sameMethodName() { echo "method in firstTrait\n"; }
}
trait secondTrait {
function sameMethodName() { echo "method in secontTrait\n"; }
}
class firstClass {
// 使用firstTrait中的sameMethodName()方法而不是用secondTrait中的。:
use firstTrait, secondTrait {
firstTrait::sameMethodName insteadof secondTrait;
}
}
$obj = new firstClass();
$obj->sameMethodName(); // Print : method in firstTrait
另一种方式
<?php
trait firstTrait {
function sameMethodName() { echo "method in firstTrait\n"; }
}
trait secondTrait {
function sameMethodName() { echo "method in secontTrait\n"; }
}
class firstClass {
use firstTrait, secondTrait {
// 使用firstTrait中的sameMethodName()方法而不是用secondTrait中的。:
firstTrait::sameMethodName insteadof secondTrait;
// 使用secondTrait中的sameMethoName()方法但改名为 anotherMethodName():
secondTrait::sameMethodName as public anotherMethodName;
}
}
$obj = new firstClass();
$obj->sameMethodName();
$obj->anotherMethodName();