我试图找出在PHP中调用神奇方法的顺序。因此编写了一个非常基本的程序
class testme
{
public $var1;
/*function __construct()
{
echo'<br/> Constructor called';
}*/
public function __set($name, $value)
{
echo'<br/> You are in sssset function';
}
public function __call($method,$arg)
{
echo '<br/> call method';
}
public function __get($name)
{
echo'<br/> You are in get function';
}
public function __isset($name)
{
echo'<br/> You are in isset function';
}
public function __unset($name)
{
echo'<br/> You are in unset function';
}
function __destruct() {
print "<br/>Destroying " . $this->name . "\n";
}
}
$obj = new testme;
$obj->var1=5;预期输出为
You are in set function
Destroying 获取:
You are in get function
Destroying 在这里,我将值设置为$obj->var1=5类,然后解释为什么它要调用__get。这里出了什么问题?
发布于 2011-04-25 21:06:30
如果您在__get内部对$name执行var_dump,您将看到它包含name。实际上是在__destruct中调用__get函数。这是因为$var1是一个可访问的成员,因此不调用__get或__set函数。
从PHP Documentation:
重载方法在与尚未声明或在当前作用域中不可见的属性或方法交互时被调用。本节的其余部分将使用术语“不可访问的属性”和“不可访问的方法”来指代声明和可见性的这种组合。
因为$var1是定义的和公共的,所以不需要调用魔术方法。
发布于 2011-04-25 21:05:49
您的类中有一个 __set 属性,因此__set不被称为:只有当没有与您试图设置的属性同名的属性时,才会调用它。
删除该公共$var1属性,将调用__set。
尽管如此,即使在删除该属性之后,仍然会调用__get。
如果您在脚本的末尾添加了一个echo,您将看到__get是在echo之后调用的--即,在脚本的末尾之后。
如果你看看你的析构函数方法:
function __destruct() {
print "<br/>Destroying " . $this->name . "\n";
}您可以看到这个析构函数试图从一个不存在的属性中读取数据--因此调用了 __get.
发布于 2011-04-25 21:06:32
只有当公共变量不可用时,才会调用__get/__set。尝试使用$obj->var2=5,您将获得预期的结果。
正在调用__get,因为您的析构命令包含未知参数$this->name
https://stackoverflow.com/questions/5778526
复制相似问题