__set和属性重载

时间:2010-12-16 09:54:33

标签: php

class object
{
    public function __construct() {}

    public function __set($property, $value) 
    { 
         $this->$property = $value;
    }

    public function __get($property) 
    {
        if (isset($property))
            return $this->$property;
    }
}

我现在得到了属性重载的概念。但是我不完全确定代码为什么会加倍$。

例如,此声明:$this->$property = $value;与通常的$this->property = $value;

相对应

我的猜测是两种说法不同的原因是:

当类具有明确定义的属性时,将使用$this->property = $value语句。为了澄清,代码具有明确定义的属性: class object { private $property; __construct(){} /... setter, getter/ }

$this->$property = $value;用于动态创建的属性。所以$this->$property实际上指的是_set 的$ property参数。为清楚起见: _set($property,$value),第一个__set方法的参数(粗体)。

哎呀,也许代码只是创建一个名为$property的新变量,而不是引用__set中的第一个参数,而$this->只是强迫类承认这个班有一个新的属性......

3 个答案:

答案 0 :(得分:2)

这是variable variable

public function __set($property, $value) 
{ 
     $this->$property = $value;
}

所以当你$this->foo = 'bar'时,PHP会注意到没有可用的可访问属性foo并委托给__set方法,$property的'foo'和{{1}的'bar' 1}}。反过来,这将按以下表达式进行评估:

$value

在旁注中,$this->foo = 'bar'; __get不能替代正确的吸气者和制定者。它们与错误处理更相关。它们也比使用常规函数慢得多,它们也使您的API难以阅读。

答案 1 :(得分:2)

您的理解是正确的。这是变量变量的一种用法;在这种特殊情况下,变量类属性。

PHP将$this->$property解析为$this->{string value of $property},并返回对象的属性,该属性命名为$property所设置的内容。

您的__get()实施略有偏差,但您忘了$this->

        if (isset($this->$property))
            return $this->$property;

答案 2 :(得分:1)

如果$property="myVar",使用$this->$property,您实际上是在引用$this->myVar ..它有点像$var1='test'; $test=10; echo $$var1;返回10:)