【问题标题】:PHP Fatal error: Cannot access empty propertyPHP致命错误:无法访问空属性
【发布时间】:2013-02-01 22:25:09
【问题描述】:

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

【问题讨论】:

  • 如果您只是学习 PHP,请寻找更多最新的教程...var 的使用和与类同名的方法表明相当古老,过时的教程
  • @MarkBaker 感谢您的指示。

标签: php fatal-error


【解决方案1】:

您以错误的方式访问该物业。使用$this-&gt;$my_value = .. 语法,您可以使用$my_value 中的值名称设置属性。你要的是$this-&gt;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

【讨论】:

  • 然后我收到错误消息Fatal error: [] operator not supported for strings in C:\xampp\htdocs\MyTestPages\f.php on line 12。第 12 行是$this-&gt;my_value[] = $value;
  • 当然.. set_value 将类型从 my_value 从数组更改为字符串。可能你想把 set_value 里面的代码改成$this-&gt;my_value[] = $value;
【解决方案2】:

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

public $my_value;

然后您可以使用它访问它

$this->my_value;

而不是

$this->$my_value;

【讨论】:

    【解决方案3】:

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

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

    请阅读文档here

    【讨论】:

    • 然后我收到错误消息Fatal error: [] operator not supported for strings in C:\xampp\htdocs\MyTestPages\f.php on line 12。第 12 行是$this-&gt;my_value[] = $value;
    • 你不能调用$this-&gt;my_value[]你应该在[]中有一个值。
    【解决方案4】:

    正如我在您的代码中看到的,您似乎正在关注关于基于 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;
    }
    
    ?>
    

    希望对你有帮助

    【讨论】:

      【解决方案5】:

      有趣:

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

      而你的foreach 将不再工作。

      【讨论】:

        【解决方案6】:

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

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

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

        echo $a->foo;  //returns bar
        

        【讨论】:

        • 会更详细..!
        【解决方案7】:

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

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

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

        当然,我应该有:

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

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

        【讨论】:

          猜你喜欢
          • 2015-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-20
          • 2013-08-04
          相关资源
          最近更新 更多