php中的__get()函数行为

use*_*867 5 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;
Run Code Online (Sandbox Code Playgroud)

预期的产出是

You are in set function
Destroying 
Run Code Online (Sandbox Code Playgroud)

获得:

You are in get function
Destroying 
Run Code Online (Sandbox Code Playgroud)

$obj->var1=5这里我将值设置为类var然后调用它的原因__get.这有什么不对?

Tim*_*per 8

如果你var_dump$name里面做__get,你会看到它包含name.__get实际上正在调用该函数__destruct.这是因为$var1是一个可访问的成员,因此,不会调用__get__set函数.

PHP文档:

在与尚未声明或在当前范围中不可见的属性或方法交互时,将调用重载方法.本节的其余部分将使用术语"不可访问的属性"和"不可访问的方法"来引用声明和可见性的这种组合.

由于$var1是定义和公开的,因此没有调用魔法方法.


Pas*_*TIN 5

你的类中有一个$var1属性,所以__set不会被调用:只有在没有你要设置的属性的属性时才调用它.

删除该公共$var1属性,__set并将被调用.


尽管如此,即使删除该属性,__get仍然会被调用.

如果你在脚本的末尾添加一个echo,你会看到__get是在echo之后被调用的 - 也就是在你的脚本结束之后.


如果你看看你的析构函数方法:

function __destruct() {
    print "<br/>Destroying " . $this->name . "\n";
}
Run Code Online (Sandbox Code Playgroud)

你看到这个析构函数试图从一个不存在的属性读取 - 因此调用__get.