PHP弱语言的Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets

我不能肯定这个方法能够解决你正遇到的问题,因为出现这个错误的触发点太广泛。

但这篇文章能告诉你根本的问题所在,然后跟着我的例子,你自行解决你程序中出现的这个问题,我想应该是OK的!

 

对于开发者来讲,有时候这句:

都可能会引发这个奇怪的致命错误:

PHP Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets in xxx.php on line xxx

而要命的是,这个错误有时出现有时又不出现;出现的时候程序根本无法运行,而你怎么查都查不出原因。

要破解谜团,得从php的弱语言特性说起。大家都知道php是弱语言,不需要定义变量类型并且随时可以转换(自动转换或者手动转换)。但是这种方便,有时候的确会带来比较大的困扰;特别的,如果这个困扰混杂有php特有的强大数组特性,有些时候可真是让人头大(甚至是安全性问题)。

比如大家熟知的:

则是字符串被当作数组的问题。另外一个问题则是数组被自动转为字符串的情况:

这个fatal error的产生,其实许多时候是因为有些程序员在开发时,没有遵守或者误用了程序规则的结果。比如,比如某程序规定,即使没有数据,也应该返回空数组,偏偏有插件返回个false甚至null,埋下了隐患;接着后来本来正确的代码却引发了主程序故障。

我在ThinkPHP里就遇到了这个问题,用TP的朋友注意看了。

这里怎么出错了?如果说$user_id 是字符串型的’0’的话,就100%出错: $model->getNickName(‘0’);

如果修改为这样就ok了:

为什么我一开始没写没写if()?因为TP说CURD,会自动检查FK的类型和值,所以按理来说,它应该检测我传参的值是否legal才进行数据库请求。
结果它没有检查,充分利用了我的信任,结果出错!

所以这个时候,mysql_query() 返回的数据与原来存储结果集的变量类型起冲突,于是报错。就好比下面这个代码一样,错误的赋值就出现了Fatal error报错:

大家可以动手试试。

团哥

继续玩我的CODE,让别人说去。 低调,就是这么自信。

You may also like...

2 Responses

  1. wmzadw说道:

    团哥 我来支持你 –哒V 😛

  2. 傻傻等你说道:

    我的原则是. 调用一个函数. 判断其返回值是否为false. 如果为false代表出错了. 如果我强烈期望它的返回值是个数组. 那我就会用is_array判断下. 否则就很可能致命错误.
    如果一个函数就是要返回true和false的. 如果出意外还返回false么? 我认为应该throw Exception… :mrgreen:
    不要信任框架.. 如果你要信任. 前提一定要是你看过它的源码. 那个逻辑你看过. 知道是咋回事…