gpt4 book ai didi

php - 如何从扩展类中的父对象中删除属性?

转载 作者:搜寻专家 更新时间:2023-10-31 21:37:57 26 4
gpt4 key购买 nike

我正试图在我无法修改的类中的变量上编写一个“监听器”。我正在扩展有问题的类,取消设置我想听的属性,然后使用 __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 方法无法拦截变量的值。

到目前为止,在我看来,这是我可以观察变量变化的唯一方法,但我不想破解框架的核心,只是检查它的便利工作(解析器)。是否有可能使这项工作奏效,或者有其他方法来解决这个问题?

最佳答案

嗯,这很奇怪。以下代码工作正常:

class A 
{
var $variable;
}

class B extends A
{
var $new_variable;

function __construct()
{
unset($this->variable);
}

function __set($thing, $data)
{
if ($thing == 'variable')
{
echo "\nThe variable value is '" . $data . "'\n";
}
}
}

$b = new B();
$b->variable = 'Intercepted'; //Output: The variable value is 'Intercepted'
$b->new_variable = 'Not intercepted'; // No output

你能告诉我这段代码是否满足你的需要,如果没有,你需要什么?

HTH

关于php - 如何从扩展类中的父对象中删除属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14744534/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com