使用变量变量将数据插入静态变量时出现 PHP 错误

PHP Error when using variable variable to insert data into static variable

提问人:Buttle Butkus 提问时间:4/25/2012 最后编辑:Buttle Butkus 更新时间:4/25/2012 访问量:272

问:

我不是很擅长这个,所以我确信这是一个愚蠢的问题。

我有一个班级:

class debug {
  private static $messages = array();
  private static $errors = array();
  private static $all = array(); // includes both of above
  private static $types = array('messages','errors');
  public static function add($type, $message) {
    if(!in_array($type,self::$types) ) {
      self::add('errors','Bad type "' . $type . '" specified when sending this message: ' . $message);
      return false;
    }
    self::$$type[] = $message; // ERROR IS HERE (see below)
    self::$all[] = $message; // no error
  }

}

我从另一个类调用它以调试(惊喜)。

debug::add('error', 'Error in ' . __FILE__ . ' on line ' . __LINE__);

来自 error.log 的 PHP 错误消息:

PHP 致命错误:无法使用 [] 读取第 1248 行的 /var/www/lib/lib.php

它指的是 debug 类中上面指定的行。

编辑:

我正在尝试做的是使用变量变量(因此发布标题)来确定要向哪个静态数组添加数据。

即,如果 $type == 'messages',则 $$type == $messages。

所以我想要 self::$$type[] == self::$messages[]

或者,如果 $type == 'errors',则 $$type == $errors and self::$$type[] == self::$errors[]

PHP 数组类 static-methods variables

评论

0赞 Taha Paksu 4/25/2012
你有错误数组,但你正在将其添加到错误数组中。
0赞 shawndreck 4/25/2012
在你的例子中$types是一个数组,索引$types[]没有设置,但你正在尝试将其用作变量。这当然是错误的。你能解释一下你打算实现什么吗?
0赞 Buttle Butkus 4/25/2012
@tpaksu,好点子,但你看我的if(!in_array(...)))应该解决这个问题。
0赞 Taha Paksu 4/25/2012
是的,只是想说我所看到的。

答:

2赞 David Z. 4/25/2012 #1

将以下行更改为。这可确保首先将其评估为“消息”或“错误”。$type

self::${$type}[] = $message; 

为了扩展这一点,这是我拥有的代码。您的代码中似乎存在其他语法错误,导致其他故障,但这就是给出该错误的原因。$$type[]

class debug {
    public static $messages = array();
    public static $errors = array();
    public static $all = array(); // includes both of above
    private static $types = array('messages','errors');
    public static function add($type, $message) {
        self::${$type}[] = $message;
        self::$all[] = $text;
    }
}

debug::add('messages', "Regular Message");
debug::add('errors', "Error Message");

print_r(debug::$messages);
print_r(debug::$errors);

这是我得到的输出

Array
(
    [0] => Regular Message
)
Array
(
    [0] => Error Message
)

评论

0赞 David Z. 4/25/2012
你能详细说明一下什么不起作用吗?我正在本地尝试这个,它似乎对我有用。
0赞 Buttle Butkus 4/25/2012
我遇到了一个致命错误。我的if(!in_array($type ... )测试应该在方法参数$type中捕获错误值。问题似乎出在 self::$$type[] 赋值中(根据我提到的致命错误)
0赞 David Z. 4/25/2012
请参阅修订版,除了使用错误之外,似乎还有一些额外的语法问题。我把我的代码转储出来供你尝试。$$type[]
0赞 Buttle Butkus 4/25/2012
嘿,当你的建议不起作用时,我感到很惊讶。事实证明,由于网络错误,我的存档没有上传。现在它确实有效。感谢您的回答和代码说明。我还添加了对 debug::add() 的递归调用来处理错误的$type参数。
2赞 Baba 4/25/2012 #2

2 错误

一个。 未正确关闭..你用了而不是在最后if(!in_array($type,self::$types) ) {)}

B. 未在脚本中的任何位置定义self::$all[] = $text;$text

尝试

class Debug {
    private static $errors = array ();
    private static $types = array (
            'messages',
            'errors' 
    );
    public static function add($type, $message) {
        if (! in_array ( $type, self::$types )) {
            return false;
        }
        self::$errors [$type][] = $message; // results in error (see below)
    }

    public static function get($type = null) {
        if (! in_array ( $type, self::$types ) && $type !== null) {
            return false;
        }

        return ($type === null) ? self::$errors : self::$errors [$type] ;
    }   
}

debug::add ( 'errors', 'Error in ' . __FILE__ . ' on line ' . __LINE__ );
debug::add ( 'messages', 'Error in ' . __FILE__ . ' on line ' . __LINE__ );

var_dump(debug::get());
var_dump(debug::get("messages"));

评论

0赞 Buttle Butkus 4/25/2012
您列出的错误 A. 和 B. 都与我指定的错误无关。A.是由于拼写错误(已修复),B.是由于我对帖子的代码简化(已修复)。感谢您如此仔细地阅读。我也喜欢你的get函数及其返回逻辑。很好。但是另一张海报发现了真正的错误,所以我会给你+1,但我给他最好的答案。
0赞 Baba 4/25/2012
我也看到了,只是不认为节省$message两次是有效和高效的