我不能肯定这个方法能够解决你正遇到的问题,因为出现这个错误的触发点太广泛。
但这篇文章能告诉你根本的问题所在,然后跟着我的例子,你自行解决你程序中出现的这个问题,我想应该是OK的!
对于开发者来讲,有时候这句:
$return['content'] .= '追加一些内容';
都可能会引发这个奇怪的致命错误:
PHP Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets in xxx.php on line xxx
而要命的是,这个错误有时出现有时又不出现;出现的时候程序根本无法运行,而你怎么查都查不出原因。
要破解谜团,得从php的弱语言特性说起。大家都知道php是弱语言,不需要定义变量类型并且随时可以转换(自动转换或者手动转换)。但是这种方便,有时候的确会带来比较大的困扰;特别的,如果这个困扰混杂有php特有的强大数组特性,有些时候可真是让人头大(甚至是安全性问题)。
比如大家熟知的:
$kkk = 'abc'; echo $kkk[0]; //输出a
则是字符串被当作数组的问题。另外一个问题则是数组被自动转为字符串的情况:
$d = array(1,2); $d .= 'ddd'; echo $d; //输出Arrayddd
这个fatal error的产生,其实许多时候是因为有些程序员在开发时,没有遵守或者误用了程序规则的结果。比如,比如某程序规定,即使没有数据,也应该返回空数组,偏偏有插件返回个false甚至null,埋下了隐患;接着后来本来正确的代码却引发了主程序故障。
我在ThinkPHP里就遇到了这个问题,用TP的朋友注意看了。
public function getNickName($user_id){ $one = $this->find($user_id); return $one['user_nickname']; }
这里怎么出错了?如果说$user_id 是字符串型的’0’的话,就100%出错: $model->getNickName(‘0’);
如果修改为这样就ok了:
/** * 获得用户名 * @param $user_id */ public function getNickName($user_id){ if($user_id > 0 && is_numeric($user_id)){ $one = $this->find($user_id); return $one['user_nickname']; }else{ return false; } }
为什么我一开始没写没写if()?因为TP说CURD,会自动检查FK的类型和值,所以按理来说,它应该检测我传参的值是否legal才进行数据库请求。
结果它没有检查,充分利用了我的信任,结果出错!
所以这个时候,mysql_query() 返回的数据与原来存储结果集的变量类型起冲突,于是报错。就好比下面这个代码一样,错误的赋值就出现了Fatal error报错:
$item = 'EMPTY'; $item[2] .= 's';
大家可以动手试试。
发表回复