Getter setter - __get()函数在php中的行为


getter setter - __get() function behavior in php

我试图找到在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 setvar1已经存在,所以不需要调用__set()

你状态

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

神奇的方法都是由互斥结构调用的,因此永远不可能用同一个操作调用多个方法。它们不是按顺序调用的