我正在嘗試在我無法修改的類中的變量上編寫「偵聽器」。我正在擴展有問題的類,取消設置我想要聽的屬性,然後使用__set來截取對該變量的寫入。在那一點上,我會比較以前的版本,並報告是否有變化。如何從擴展類的父對象中刪除屬性?
class A {
var $variable;
...
}
class B extends A {
var $new_variable
function __construct() {
parent::__construct();
unset($this->variable);
}
function __set($thing, $data) {
if ($thing == 'variable') {
// Report change
// Set $new_variable so we can use __get on it
}
}
public function __get($var) {
if (isset($this->$var)) {
// Get as normal.
return $this->$var;
} elseif ($var == 'variable' && isset($this->new_variable)) {
return $this->new_variable;
}
}
...
}
如果我修改類問題,而不是直接通過擴展類,除去變量的聲明和引入setter和getter方法這工作。問題是,當我使用上面顯示的模式時,unset()調用看起來實際上並沒有從父類中移除繼承的變量,因此使__set方法無法截取變量的值。
到目前爲止,我認爲這是我可以觀察變量變化的唯一方法,但我不想破解框架的核心,只能檢查它的方便工作(解析器)。是否有可能做出這項工作,或以其他方式解決這個問題?
原來問題的一部分,但不是全部,是我用property_exists()在__get方法,而不是isset()函數來檢查屬性的存在。 – epocsquadron