php中的__get()函数行为

时间:2011-04-25 12:56:17

标签: php getter-setter

我试图找到在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的原因。这有什么不对?

4 个答案:

答案 0 :(得分:8)

如果您在var_dump内的$name上进行了__get,则会看到它包含name__get函数实际上是在__destruct中调用的。这是因为$var1是可访问的成员,因此不会调用__get__set函数。

来自PHP Documentation:

  

调用重载方法   与属性或与之交互时   尚未声明的方法或   在当前范围内不可见。   本节的其余部分将使用   术语“难以接近的属性”和   “难以接近的方法”来指代   这种宣言和结合   可视性。

由于$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 setvar1存在,因此无需调用__set()

你陈述

  

我试图找到序列   哪种神奇的方法被称为

魔术方法都是由互斥结构调用的,所以从来没有任何方法可以使用相同的操作调用多个。它们不是按顺序调用的。