我试图在一个我无法修改的类中写一个变量的“监听器”。我扩展了所涉及的类,取消了我想要监听的属性,然后使用__set来拦截对该变量的写入。此时,我会将其与先前版本进行比较,并报告是否有更改。
如果我直接修改相关类而不是通过扩展类来进行修改,即删除变量的声明并引入setter和getter方法,则此方法有效。问题在于当我使用上面所示的模式时,unset()调用似乎并没有实际删除从父类继承的变量,因此使得__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方法无法拦截变量的值。
到目前为止,这似乎是我能够观察变量更改的唯一方法,但我不想黑客攻击框架的核心,只是检查它的便利工具(解析器)的工作。有没有可能使这个工作,或者另一种方法来解决这个问题?