如何启动trait定义的构造函数和析构函数以及类的构造函数和析构函数.例如,
trait Audit
{
public function __construct()
{
parent::__construct(); // Doesn't work...
$this->_name = __CLASS__;
$this->AuditAction('Started');
}
public function __destruct()
{
parent::__destruct(); // Doesn't work...
$this->AuditAction('Ended');
echo $this->_log;
}
public function AuditAction($n)
{
$this->_log .= $this->GetCurrentTimeStamp() . ' ' . $this->_name . ": $n" . PHP_EOL;
}
private function GetCurrentTimeStamp()
{
return (new DateTime())->format('[Y-m-d H:i:s]');
}
private $_name, $_log = '';
}
class C
{
use Audit;
public function __construct()
{
}
public function __destruct()
{
}
}
$c = new C();Run Code Online (Sandbox Code Playgroud)
我应该得到几行文本,但我得不到,因为C类的构造函数被显式调用.有没有办法实现这个目标?
在组成类时,C的构造函数和析构函数优先于trait构造函数和析构函数:
来自基类的继承成员被特征插入的成员覆盖.优先顺序是来自当前类的成员重写Trait方法,这些方法返回覆盖继承的方法.
资料来源:http://php.net/traits
换句话说,从C中删除空构造函数和析构函数,将使用trait的构造函数和析构函数.没有办法使用C和traits,构造函数和析构函数来完成这项工作,因为traits不像常规继承那样工作.
一般来说,我建议不要给Traits他们自己的构造函数或析构函数,因为你不能实例化Traits.您从具有 Trait 的类中实例化,该类应该处于控制之中.考虑在特征中添加一个onCreate()或onDestroy()方法,然后从C上的相应魔术方法中调用它们.你可以通过在C中对特征__construct进行别名来实现相同的效果,但我认为这可以解决语义问题.
| 归档时间: |
|
| 查看次数: |
4564 次 |
| 最近记录: |