2013-02-17 40 views
54

我是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 
+9

如果你刚开始学习PHP,寻找一些更先进的最新教程...使用var'和方法的'与班级名称相同表示一个相当陈旧,过时的教程 – 2013-02-17 10:42:57

+0

@MarkBaker感谢您的指导。 – Bishan 2013-02-17 10:47:00

回答

159

您以错误的方式访问该属性。使用$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')); 

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

+0

然后我得到错误说'致命错误:[]运算符不支持字符串在C:\ xampp \ htdocs \ MyTestPages \ f.php 12行。第12行是'$ this-> my_value [] = $ value;' – Bishan 2013-02-17 10:45:35

+0

Sure .. set_value将数组中的my_value类型更改为字符串。可能你想要将set_value中的代码更改为'$ this-> my_value [] = $ value;' – Philipp 2013-02-17 10:48:25

+0

感谢Philipp。 – Bishan 2013-02-17 10:51:02

9

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

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

请阅读文档here

+0

然后我得到错误说'致命错误:[]运算符不支持字符串在C:\ xampp \ htdocs \ MyTestPages \ f.php 12行。第12行是'$ this-> my_value [] = $ value;' – Bishan 2013-02-17 10:45:57

+0

你不能调用'$ this-> my_value []''你应该在'[]'中有一个值。 – Val 2013-02-17 16:31:16

27

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

public $my_value; 

然后你就可以使用

$this->my_value; 

,而不是

$this->$my_value; 
1

有趣的访问:

    进去 $a->my_value[] = 'b';
  1. 分配一个字符串变量
  2. 您声明数组var $my_value = array();
  3. 推值。 (所以它没有更多的阵列)$a->set_value ('c');
  4. 试图将值推入数组,这不再存在。 (它是字符串)$a->my_class('d');

而且你的foreach将不再工作。

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; 
} 

?> 

我希望它能帮助

0

我知道这个答案是不被OP描述的问题的直接回应,但我发现这个问题,作为搜索相同错误消息的结果。我认为这值得在这里发布我的经验,以防万一任何人混淆同一事物...

由于格式错误的for循环遍历关联数组,您可能会遇到有问题的错误。在一个合适骨的头脑中,我使用 - 在我for语句>代替=>:

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

当然,我应该有:

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

我感到很困惑,首先,认为报告的错误是指someArray属性!

1

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

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

现在,你可以实现它想:

echo $a->foo; //returns bar 
+0

会更详细..! – Chella 2015-10-30 10:47:34

相关问题