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->
只是强迫类承认这个班有一个新的属性......
答案 0 :(得分:2)
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:)