在php类中使用undefined属性

时间:2018-01-25 09:21:20

标签: php

<?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

为什么会这样?

3 个答案:

答案 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

在手册中找到答案。