Làm thế nào tôi có thể khởi chạy hàm tạo và hàm hủy được xác định bởi đặc điểm cùng với hàm tạo và hàm hủy của lớp. Ví dụ:Constructor/destructor được xác định bởi đặc tính không được gọi là
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();
Tôi sẽ nhận được một vài dòng văn bản nhưng tôi không nhận được văn bản nào vì hàm tạo của lớp C được gọi rõ ràng thay thế. Có cách nào để đạt được điều này?
Đây không phải là chính xác. Có thể gọi các phương thức của Trait được ghi đè bởi lớp có sử dụng Trait. Nó là đủ để thay đổi tên của các phương pháp trong Trait với cái gì khác. – Aerendir
@Aerendir Nếu đọc của tôi về nguồn C là chính xác, một ctor bí danh hoặc dtor sẽ không chứa các ctor hoặc dtor chức năng cờ nữa. Điều này ngụ ý rằng nó là về mặt kỹ thuật * không khả thi *, bởi vì chúng chỉ là các phương pháp thông thường. Tuy nhiên, rõ ràng là bạn có thể thực hiện chúng * như các phương thức thông thường * bằng cách đánh dấu và điều đó sẽ giải quyết vấn đề của OP một cách hiệu quả.Nhưng điều đó giống như gọi phương thức custom'onCreate() 'hoặc' onDestroy() 'hơn là gọi các ctors hoặc dtors thực tế. – Gordon