2012-02-17 185 views
7

当在PHP 5.4上测试“面向未来的”代码时,我收到了一个我不明白的警告。我的数组索引是“非法字符串偏移量”?

function __clone() { 
    $this->changed = TRUE; 
    foreach ($this->conditions as $key => $condition) { 
    if (
    $condition['field'] 
    instanceOf QueryConditionInterface) { 
     $this->conditions[$key]['field'] = clone($condition['field']); 
    } 
    } 
} 

我爆发了$condition['field']到它自己的行,以减少代码量的集中地。关于特定线路,PHP有这样一段话

警告:非法串在DatabaseCondition->__clone()

偏移'field'我只是不明白“场”怎么样,是一个非法的字符串偏移量。我猜测我只是错过了一些明显的东西,但如果社区找不到问题,我会提交一份错误报告。

我将此警告解释为“”在任何情况下,“字段”都不是有效的密钥“。如果我曾试图将数组作为关键字,那么这个错误是有道理的。

+0

代码审查是为了改进工作代码。关于警告含义的具体问题在那里是无关紧要的。 – 2012-02-17 21:13:09

+1

你可以'var_dump('$ this-> conditions');'? – 2012-02-17 21:29:34

+0

在PHP 5.4下安装Drupal时也会出现这个错误http://drupal.org/node/1483986我相信PHP 5.4中的某些内容已经损坏,或者'field'现在是一个保留的PHP关键字,不能用于数组,但我倾向于PHP错误。据报道,在PHP上的以前版本中不会发生此错误。 – Brain2000 2012-03-21 15:14:37

回答

2

该警告看起来像它的说法,$condition是一个字符串。没有任何关于代码的知识,我不认为这是否合理。

+0

Bah,你说得对。正如上面“Mike Purcell”所建议的那样,当var_dump $条件发生错误时,它似乎有时会变成一个字符串。 – Letharion 2012-02-19 21:46:58

3

没有关于创建条件数组/迭代器的更多知识,我只能假设你应该首先检查偏移量是否存在。

if(isset($condition['field']) && $condition['field'] instanceOf QueryConditionInterface) 

使用isset在这种情况下是足够的,比array_key_exists更快,唯一的区别是,如果$条件[“场”]为NULL isset将返回跌倒,array_key_exists将返回true,引起键存在。但是因为您只想处理QueryConditionInterface实例的字段,所以您可以使用isset正常运行。

+0

这可能是我慢了,但我不明白这是如何适用的?如果这是关于“现场”不存在的通知,那么我将不会有任何问题回溯问题并找出问题的根源。但现在,我读错误的方式是,在任何情况下,'字段'都不是有效的key_;这对我没有意义。还将此添加到问题中。 – Letharion 2012-02-17 19:14:23

+0

如果$ condition是没有数组或数组对象的实现,那么你试图访问字符串,你不能访问字符串字符串数组作为键,并获得非法的字符串偏移错误,这是我的新看到的错误在5.4大多数情况下,我在6.0分支上看到它...... – 2012-02-18 22:49:53

+0

例如,$ condition的值可以是'AND'。 – olleolleolle 2012-11-29 06:56:50