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

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

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

但这篇文章能告诉你根本的问题所在,然后跟着我的例子,你自行解决你程序中出现的这个问题,我想应该是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’);

https://blog.img.crazyphper.com/2011/12/error-300x19.jpg

如果修改为这样就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';

大家可以动手试试。

赞赏
# # #
首页      程序开发      PHP      PHP弱语言的Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets

团哥

文章作者

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

发表回复

textsms
account_circle
email

  • wmzadw

    团哥 我来支持你 –哒V 😛

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

    13 年前 回复

konakona

PHP弱语言的Fatal error: Cannot use assign-op operators with overloaded objects nor string offsets
我不能肯定这个方法能够解决你正遇到的问题,因为出现这个错误的触发点太广泛。 但这篇文章能告诉你根本的问题所在,然后跟着我的例子,你自行解决你程序中出现的这个问题,我想应该是…
扫描二维码继续阅读
2011-12-15