我试图找到在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
这里我将值设置为类var,然后为什么它调用__get
。这里出了什么问题?
如果您在__get
内对$name
执行var_dump
,您将看到它包含name
。__get
函数实际上在__destruct
中被调用。这是因为$var1
是一个可访问的成员,因此不调用__get
或__set
函数。
来自PHP文档:
重载方法被调用与属性或未声明的方法或在当前作用域中不可见。本节的其余部分将使用术语"不可访问属性"answers"不可访问的方法"来指代声明和的组合可见性。
由于$var1
是定义的并且是公共的,所以没有调用魔术方法。
你在你的类中有一个$var1
属性,所以__set
不被调用:它只在没有属性时被调用,你试图设置的名称
删除公共$var1
属性,__set
将被调用。
但是,即使删除了该属性,__get
仍然被调用。
如果你在脚本的末尾放一个echo,你会看到__get在echo之后被调用——也就是说,在你脚本的末尾之后。
如果你看一下你的析构函数
function __destruct() {
print "<br/>Destroying " . $this->name . "'n";
}
您看到这个析构函数试图从一个不存在的属性中读取——因此调用__get
。
__get
/__set
仅在公共变量不可用时调用。试试$obj->var2=5
,你会得到预期的结果。
__get
正在被调用,因为您的destruct命令包含一个未知参数$this->name
get
被析构函数($this->name
)调用。类没有name
成员,所以调用了magical get。只有当您尝试设置一个不存在的成员时,才会调用Magical set
。var1
已经存在,所以不需要调用__set()
。
我试图找到序列在哪些神奇的方法被称为
神奇的方法都是由互斥结构调用的,因此永远不可能用同一个操作调用多个方法。它们不是按顺序调用的