php中的__get()函数行为

| 我试图找到在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
中调用的。这是因为ѭ11是可访问的成员,因此不会调用
__get
__set
函数。 从PHP文档:   重载方法被调用   与属性互动时   尚未声明的方法,或者   在当前范围内不可见。   本节的其余部分将使用   条款“无法访问的属性”和   “无法访问的方法”指   声明和   能见度。 由于ѭ11是定义的并且是公共的,因此没有调用magic方法的方法。     
您的班级中有一个
$var1
属性,因此
__set
不会被调用:只有在没有您要设置的名称的属性时,它才会被调用。 删除该公共
$var1
属性,将调用
__set
。 即使删除了该属性,仍会调用
__get
。 如果您在脚本的末尾添加回显,则会看到__get的调用要比echo的要晚-也就是说,在脚本结束之后。 如果您看一下您的析构函数方法:
function __destruct() {
    print \"<br/>Destroying \" . $this->name . \"\\n\";
}
您会看到此析构函数试图从不存在的属性中进行读取-因此调用了
__get
。     
仅当公共变量不可用时才调用
__get
/
__set
。试试
$obj->var2=5
,您会得到预期的结果。 正在调用
__get
,因为您的destruct命令包含未知参数
$this->name
    
析构函数(
$this->name
)正在调用27ѭ。该课程没有
name
成员,因此称为神奇的get。仅当您尝试设置不存在的成员时,才会调用Magical
set
var1
存在,因此不需要
__set()
。 你说   我正在尝试找到序列   哪些魔术方法被称为 魔术方法都是通过互斥构造调用的,因此,用相同的操作永远无法调用多个方法。它们不是按顺序调用的。     

要回复问题请先登录注册