<?php
class Base
{
public function hello()
{
echo 'method hello from class Base' . PHP_EOL;
}
}
trait Hello
{
public function hello()
{
echo 'method hello from Trait Hello!' . PHP_EOL;
}
public function hi()
{
echo 'method hi from Trait Hello' . PHP_EOL;
}
abstract public function getValue();
static public function staticMethod()
{
echo 'static method staticMethod from Trait Hello' . PHP_EOL;
}
public function staticValue()
{
static $value;
$value++;
echo "$value" . PHP_EOL;
}
}
trait Hi
{
public function hello()
{
parent:: hello();
echo 'method hello from Trait Hi!' . PHP_EOL;
}
public function hi()
{
echo 'method hi from Trait Hi' . PHP_EOL;
}
}
trait HelloHi
{
use Hello, Hi {
Hello::hello insteadof Hi;
Hi::hi insteadof Hello;
}
}
class MyNew extends Base
{
use HelloHi;
private $value = 'class MyNew' . PHP_EOL;
public function hi()
{
echo 'method hi from class MyNew' . PHP_EOL;
}
public function getValue()
{
return $this->value;
}
}
$obj = new MyNew ();
$obj->hello();
//输出:'method hello from Trait Hello!'
//优先级顺序:trait中的方法又覆盖了基类中的方法
$obj->hi();
//输出:'method hi from class MyNew'
//优先级顺序:当前类中的方法会覆盖 trait 方法
MyNew::staticMethod();
//输出:'static method staticMethod from Trait Hello'
//静态方法:trait中可以定义静态方法
echo $obj->getValue();
//输出:'class MyNew'
//抽象成员:trait中可以使用抽象方法
$objOther = new MyNew();
$obj->staticValue();
//输出:1