<?php
class a{
public function out(){
$this->test = 8;
return $this->test;
}
}
$b = new a();
echo $b->out();
?>
output: 8
当我运行此代码时,输出结果8。
但是当我添加__set()函数时,它会输出一个通知,而不是8输出
<?php
class a{
public function __set($property, $value) {
}
public function out(){
$this->test = 8;
return $this->test;
}
}
$b = new a();
echo $b->out();
?>
输出:
PHP注意:未定义的属性:/ usercode / file.php中的a :: $ test在线 13
为什么会这样?
答案 0 :(得分:5)
运行a::out()
时,对象中没有$test
属性。 This is why $this->test = 8;
invokes a::__set()
但是a::__set()
没有创建$test
属性,而下一个语句(return $this->test;
)找不到它并生成通知。
您应该在类定义中声明对象属性并在构造函数中初始化它们(如果适用):
class a {
private $test; // <-- because of this, $this->test exists...
public function __set($property, $value) {
}
public function out() {
$this->test = 8; // ... and __set() is not invoked here
return $this->test;
}
}
如果没有定义__set()
,语句$this->test = 8;
会创建当前对象的$test
属性(如果尚未创建)(通过其定义或之前的赋值)将8
存入其中。
当定义__set()
时,任何尝试设置不存在或不可访问的属性(在类中设置从父类继承的private
属性或设置{class 1}}处理{class 1}}或protected
属性。您private
的实现不会创建缺少的属性,它基本上将语句__set()
转换为无操作。
答案 1 :(得分:4)
根据docs
__ set()在将数据写入不可访问的属性时运行。
由于您的__set
正文中没有任何内容,因此该属性未创建,因此无法使用。您必须定义方法体。
class a{
public function __set($property, $value) {
$this->$property = $value;
}
public function out(){
$this->test = 8;
return $this->test;
}
}
$b = new a();
echo $b->out();
现在输出8
。
<强>更新强> 你问为什么第一个代码块工作,第二个代码块不工作。看一下PHP source code here,您将在代码中看到解释。
在我看来,如果你的课程中没有__set()
并且你$this->test
,那么PHP内部会将其称为__set()
,这正是它所做的确实:将属性名称设置为特定值。
但是当您使用空主体定义__set()
时,它会覆盖默认的内部__set()
并且不执行任何操作。这就是您的代码失败的主要原因 - 您的__set()
或内部属性都没有设置所请求的属性。
答案 2 :(得分:1)
以下是真的。
<?php
class a{
public function __set($property, $value) {
$this->$property = $value;
}
public function out(){
$this->test = 8;
return $this->test;
}
}
$b = new a();
echo $b->out();
你应该看看php overloading
在手册中找到答案。