首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php中的__get()函数行为

php中的__get()函数行为
EN

Stack Overflow用户
提问于 2011-04-25 20:56:17
回答 4查看 541关注 0票数 5

我试图找出在PHP中调用神奇方法的顺序。因此编写了一个非常基本的程序

代码语言:javascript
复制
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;

预期输出为

代码语言:javascript
复制
You are in set function
Destroying 

获取:

代码语言:javascript
复制
You are in get function
Destroying 

在这里,我将值设置为$obj->var1=5类,然后解释为什么它要调用__get。这里出了什么问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-25 21:06:30

如果您在__get内部对$name执行var_dump,您将看到它包含name。实际上是在__destruct中调用__get函数。这是因为$var1是一个可访问的成员,因此不调用__get__set函数。

PHP Documentation:

重载方法在与尚未声明或在当前作用域中不可见的属性或方法交互时被调用。本节的其余部分将使用术语“不可访问的属性”和“不可访问的方法”来指代声明和可见性的这种组合。

因为$var1是定义的和公共的,所以不需要调用魔术方法。

票数 8
EN

Stack Overflow用户

发布于 2011-04-25 21:05:49

您的类中有一个 __set 属性,因此__set不被称为:只有当没有与您试图设置的属性同名的属性时,才会调用它。

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

尽管如此,即使在删除该属性之后,仍然会调用__get

如果您在脚本的末尾添加了一个echo,您将看到__get是在echo之后调用的--即,在脚本的末尾之后。

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

代码语言:javascript
复制
function __destruct() {
    print "<br/>Destroying " . $this->name . "\n";
}

您可以看到这个析构函数试图从一个不存在的属性中读取数据--因此调用了 __get.

票数 5
EN

Stack Overflow用户

发布于 2011-04-25 21:06:32

只有当公共变量不可用时,才会调用__get/__set。尝试使用$obj->var2=5,您将获得预期的结果。

正在调用__get,因为您的析构命令包含未知参数$this->name

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5778526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档