PHP致命错误:无法访问空属性
我是新来的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 
	
 您以错误的方式访问该属性。 使用$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时不会将其types更改为string或其他types。 但是你仍然可以直接设置my_value的值,因为它是公共的。 最后一步是使my_value保密,并且只能通过getter / setter方法访问my_value
首先,不要使用var声明variables,但是
 public $my_value; 
然后你可以使用它来访问它
 $this->my_value; 
并不是
 $this->$my_value; 
 要访问类中的variables,必须使用$this->myVar而不是$this->$myvar 。 
 而且,你应该使用访问标识符来声明一个variables而不是var 。 
请在这里阅读文档。
正如我在你的代码中看到的,似乎你正在遵循一个关于基于PHP4的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; } ?> 
我希望它有帮助
有趣:
-  你声明了一个数组var $my_value = array();
-  将值推入$a->my_value[] = 'b';
-  为variables分配一个string。  (所以它不再是数组) $a->set_value ('c');
-  试图将值推入数组,这不再存在。  (它的string) $a->my_class('d');
 而你的foreach不会再工作了。 
我意识到这个答案不是对OP描述的问题的直接回应,但是我发现这个问题是由于search相同的错误消息的结果。 我认为这是值得在这里发布我的经验,以防万一有人混淆了同样的事情…
 由于格式不正确for循环遍历关联数组,可能会遇到有问题的错误。 在我头脑中,我正在使用 – >而不是=> for表示: 
  foreach ($object->someArray as $key->$val) { // do something } 
当然,我应该有:
  foreach ($object->someArray as $key=>$val) { // do something } 
起初,我迷惑自己,认为报告的错误是指someArray属性!
这样您可以使用自定义属性名称创build一个新的对象。
 $my_property = 'foo'; $value = 'bar'; $a = (object) array($my_property => $value); 
现在你可以达到它,如:
 echo $a->foo; //returns bar