64

我是新手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
4

7 回答 7

180

您以错误的方式访问该物业。使用该$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

于 2013-02-17T10:41:02.613 回答
32

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

public $my_value;

然后你可以使用它访问它

$this->my_value;

并不是

$this->$my_value;
于 2013-02-17T10:41:53.987 回答
10

要访问类中的变量,您必须使用$this->myVar而不是$this->$myvar.

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

请在此处阅读文档。

于 2013-02-17T10:41:14.167 回答
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;
}

?>

我希望它有帮助

于 2013-02-17T10:51:19.137 回答
1

有趣的:

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

foreach不会再工作了。

于 2013-02-17T10:46:41.143 回答
1

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

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

现在你可以像这样到达它:

echo $a->foo;  //returns bar
于 2015-10-30T10:41:37.193 回答
0

我意识到这个答案不是对 OP 描述的问题的直接回应,但我发现这个问题是由于搜索相同的错误消息。我认为值得在这里发布我的经验,以防万一有人对同样的事情感到困惑......

for由于关联数组上的循环格式不正确,您可能会遇到相关错误。出于头脑清醒,我在for声明中使用 -> 而不是 => :

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

当然,我应该有:

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

起初我很困惑,认为报告的错误是指 someArray 属性!

于 2015-10-21T21:21:32.317 回答