<?php
//日志类
class Logger
{
//读取日志信息
public function log(string $message, int $level)
{
echo "[message]:{$message}" . PHP_EOL;
echo "[level]:{$level}" . PHP_EOL;
}
}
//扩展日志功能
trait Loggable
{
protected $logger;
/**
* 记录日志
* @param DemoLogger $logger
*/
public function setLogger(Logger $logger)
{
$this->logger = $logger;
}
/**
* 读取日志
* @param string $message
* @param int $level
*/
public function getLog(string $message, int $level)
{
$this->logger->log($message, $level);
}
public function test()
{
echo ‘trait test‘ . PHP_EOL;
}
}
//基类
class Base
{
public static $className = ‘Base‘;
public function test()
{
echo static::getClassName() . ‘ test‘ . PHP_EOL;
}
//获取类名称
public static function getClassName(): string
{
//return self::$className;
return static::$className;//static延时静态绑定
}
}
class Foo extends Base
{
public static $className = ‘Foo‘;
use Loggable;
}
$foo = new Foo;
$foo->setLogger(new Logger);
$foo->getLog(‘trait works‘, 1);//打印日志信息
$foo->test(); //trait test
分析这里 $foo->test()
- Foo类中使用use Loggable来扩展Foo类增加日志功能;
- Trait Loggable类中含有test()方法;
- Foo类继承Base类,其中Base类中含有test();
- 那么问题来了:$foo->test()到底调用的是继承自父类test(),还是Trait类中的test()?
因此,$foo->test()调用的是Trait类中的方法
原文地址:http://blog.51cto.com/phpme/2128536