未调用由trait定义的构造函数/析构函数

nha*_*123 8 php traits

如何启动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类的构造函数被显式调用.有没有办法实现这个目标?

Gor*_*don 5

在组成类时,C的构造函数和析构函数优先于trait构造函数和析构函数:

来自基类的继承成员被特征插入的成员覆盖.优先顺序是来自当前类的成员重写Trait方法,这些方法返回覆盖继承的方法.

资料来源:http://php.net/traits

换句话说,从C中删除空构造函数和析构函数,将使用trait的构造函数和析构函数.没有办法使用C和traits,构造函数和析构函数来完成这项工作,因为traits不像常规继承那样工作.

一般来说,我建议不要给Traits他们自己的构造函数或析构函数,因为你不能实例化Traits.您从具有 Trait 的类实例化,该类应该处于控制之中.考虑在特征中添加一个onCreate()onDestroy()方法,然后从C上的相应魔术方法中调用它们.你可以通过在C中对特征__construct进行别名来实现相同的效果,但我认为这可以解决语义问题.