gpt4 book ai didi

php - 特征定义的构造函数/析构函数未被调用

转载 作者:可可西里 更新时间:2023-11-01 12:33:42 25 4
gpt4 key购买 nike

如何启动由 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();

我应该得到几行文本,但我什么也没得到,因为 C 类的构造函数被显式调用了。有办法实现吗?

最佳答案

当组合类时,C 的构造函数和析构函数将优先于特征构造函数和析构函数:

An inherited member from a base class is overridden by a member inserted by a Trait. The precedence order is that members from the current class override Trait methods, which in return override inherited methods.

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

换句话说,从 C 中删除空的构造函数和析构函数,将使用特征的构造函数和析构函数。无法同时使用 C 和特征、构造函数和析构函数,因为特征不像常规继承那样工作。

一般来说,我建议不要为 Traits 提供它们自己的构造函数或析构函数,因为您无法实例化 Traits。您从一个具有 Trait 的类实例化,并且该类应该处于控制之下。考虑向特征添加 onCreate()onDestroy() 方法,并从 C 上适当的魔术方法调用它们。您可以通过别名化特征 __construct 来实现相同的目的在 C 中,但我认为这淡化了语义。

关于php - 特征定义的构造函数/析构函数未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14157347/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com