Come posso avviare il costruttore e il distruttore definiti da tratto insieme al costruttore e al distruttore della classe. Ad esempio,Il costruttore/distruttore definito da tratto non viene chiamato
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();
dovrei ottenere paio di righe di testo ma ottengo nessuno dal costruttore della classe di C è esplicitamente chiamato invece. C'è un modo per ottenere questo?
Questo non è corretto. È possibile chiamare metodi del Tratto che vengono sovrascritti dalla classe che utilizza il Tratto. È sufficiente cambiare il nome dei metodi nel Tratto con qualcos'altro. – Aerendir
@Airendir Se la mia lettura della sorgente C è corretta, un ctor o un datore di alias non conterrà più i flag di funzione ctor o dtor. Ciò implica che tecnicamente * non è possibile *, perché sono solo metodi regolari allora. Tuttavia, hai ovviamente ragione che puoi eseguirli * come metodi regolari * tramite aliasing e che risolveranno efficacemente il problema dell'OP.Ma è più come chiamare un metodo personalizzato 'onCreate()' o 'onDestroy()' piuttosto che chiamare veri e propri operatori. – Gordon