如何啓動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類的構造函數被顯式調用。有沒有辦法做到這一點?
這是不正確的。可以調用被使用特徵的類覆蓋的特徵的方法。用其他的東西來改變Trait中方法的名字就足夠了。 – Aerendir
@Aerendir如果我對C源的閱讀是正確的,那麼別名ctor或dtor將不再包含ctor或dtor函數標誌。這意味着它在技術上*不可能*,因爲它們只是常規方法。然而,你顯然是正確的,你可以通過別名來執行它們*作爲常規方法*,這將有效解決OP的問題。但更像是調用一個自定義的'onCreate()'或'onDestroy()'方法,而不是調用實際的ctors或dtors。 – Gordon