PHP致命错误:无法访问空属性

时间:2013-02-17 10:39:21

标签: php fatal-error

我是php的新手,我执行了以下代码。

<?php
class my_class{

    var $my_value = array();
    function my_class ($value){
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->$my_value = $value;

    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c');
$a->my_class('d');

foreach ($a->my_value as &$value) {
    echo $value;
}

?>

我遇到了以下错误。可能是什么错误?

Notice: Undefined variable: my_value in C:\xampp\htdocs\MyTestPages\f.php on line 15

Fatal error: Cannot access empty property in C:\xampp\htdocs\MyTestPages\f.php on line 15

7 个答案:

答案 0 :(得分:170)

您以错误的方式访问该媒体资源。使用$this->$my_value = ..语法,您可以使用$ my_value中的值名称设置该属性。你想要的是$this->my_value = ..

$var = "my_value";
$this->$var = "test";

相同
$this->my_value = "test";

要修复示例中的一些内容,下面的代码是更好的方法

class my_class {

    public  $my_value = array();

    function __construct ($value) {
        $this->my_value[] = $value;
    }

    function set_value ($value) {
        if (!is_array($value)) {
            throw new Exception("Illegal argument");
        }

        $this->my_value = $value;
    }

    function add_value($value) {
        $this->my_value = $value;
    }
}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->add_value('c');
$a->set_value(array('d'));

这可以确保my_value在调用set_value时不会将其类型更改为字符串或其他内容。但你仍然可以直接设置my_value的值,因为它是公开的。最后一步是,将my_value设为私有,仅通过getter / setter方法访问my_value

答案 1 :(得分:31)

首先,不要使用var声明变量,而是

public $my_value;

然后您可以使用

访问它
$this->my_value;

而不是

$this->$my_value;

答案 2 :(得分:9)

要访问班级中的变量,您必须使用$this->myVar代替$this->$myvar

并且,您应该使用访问标识符来声明变量而不是var

请阅读文档here

答案 3 :(得分:5)

正如我在你的代码中所看到的那样,你似乎正在关注基于PHP4的PHP中的OOP旧文档/教程(不支持OOP但是以某种方式使用以简单方式使用),因为PHP5是官方支持添加了,符号已经改变了。

请在此处查看此代码评论:

<?php
class my_class{

    public $my_value = array();

    function __construct( $value ) { // the constructor name is __construct instead of the class name
        $this->my_value[] = $value;
    }
    function set_value ($value){
    // Error occurred from here as Undefined variable: my_value
        $this->my_value = $value; // remove the $ sign
    }

}

$a = new my_class ('a');
$a->my_value[] = 'b';
$a->set_value ('c'); // your array variable here will be replaced by a simple string 
// $a->my_class('d'); // you can call this if you mean calling the contructor 


// at this stage you can't loop on the variable since it have been replaced by a simple string ('c')
foreach ($a->my_value as &$value) { // look for foreach samples to know how to use it well
    echo $value;
}

?>

我希望它有所帮助

答案 4 :(得分:1)

有趣:

  1. 您声明了一个数组var $my_value = array();
  2. 将值推入$a->my_value[] = 'b';
  3. 将字符串分配给变量。 (所以它不再是数组)$a->set_value ('c');
  4. 尝试将值推送到数组中,不再存在。 (它的字符串)$a->my_class('d');
  5. 你的foreach不再适用了。

答案 5 :(得分:1)

这样您就可以创建一个具有自定义属性名称的新对象。

$my_property = 'foo';
$value = 'bar';
$a = (object) array($my_property => $value);

现在你可以达到:

echo $a->foo;  //returns bar

答案 6 :(得分:0)

我意识到这个答案不是对OP描述的问题的直接回答,但我发现这个问题是搜索相同错误信息的结果。我认为值得在这里发布我的经验,以防万一有人混淆了同样的事情......

由于关联数组上格式不正确的for循环,您可能会遇到相关错误。我很喜欢使用 - &gt;而不是=&gt;在我的for声明中:

        foreach ($object->someArray as $key->$val) {
            // do something
        }

当然,我应该有:

        foreach ($object->someArray as $key=>$val) {
            // do something
        }

我一开始很困惑,认为报告的错误是指someArray属性!