我试图找到在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
的原因。这有什么不对?
答案 0 :(得分:8)
如果您在var_dump
内的$name
上进行了__get
,则会看到它包含name
。 __get
函数实际上是在__destruct
中调用的。这是因为$var1
是可访问的成员,因此不会调用__get
或__set
函数。
调用重载方法 与属性或与之交互时 尚未声明的方法或 在当前范围内不可见。 本节的其余部分将使用 术语“难以接近的属性”和 “难以接近的方法”来指代 这种宣言和结合 可视性。
由于$var1
已定义且公开,因此不会调用魔术方法。
答案 1 :(得分:5)
您的班级中有$var1
个属性,因此__set
未被调用:只有在没有属性名称的属性时才会调用它试图设置。
删除该公开$var1
属性,并调用__set
。
尽管如此,即使删除了该属性,仍然会调用__get
。
如果你在脚本的末尾添加了一个echo,你会看到__get是在echo之后被调用的 - 也就是在你的脚本结束之后。
如果你看看你的析构函数方法:
function __destruct() {
print "<br/>Destroying " . $this->name . "\n";
}
你看到这个析构函数试图从不存在的属性读取 - 因此调用__get
。
答案 2 :(得分:0)
__get
/ __set
。试试$obj->var2=5
,您就会得到预期的结果。
__get
,因为您的destruct命令包含一个未知参数$this->name
答案 3 :(得分:0)
get
)正在调用 $this->name
。该类没有name
成员,因此调用了神奇的get。只有在您尝试设置不存在的成员时,才会调用Magical set
。 var1
存在,因此无需调用__set()
。
你陈述
我试图找到序列 哪种神奇的方法被称为
魔术方法都是由互斥结构调用的,所以从来没有任何方法可以使用相同的操作调用多个。它们不是按顺序调用的。