spModel类在php5.3下一个E_STRICT警告

#1 stalker

public function create($row)
        {
                if(!is_array($row))return FALSE;
                $row = $this->__prepera_format($row);
                if(empty($row))return FALSE;
                foreach($row as $key => $value){
                        $cols[] = $key;
                        $vals[] = $this->escape($value);
                }
                $col = join(',', $cols);
                $val = join(',', $vals);

                $sql = "INSERT INTO {$this->tbl_name} ({$col}) VALUES ({$val})";
                if( FALSE != $this->_db->exec($sql) ){ // 获取当前新增的ID
                        if( $newinserid = $this->_db->newinsertid() ){
                                return $newinserid;
                        }else{
     return array_pop( $this->find($row, "{$this->pk} DESC",$this->pk) );                        }
                }
                return FALSE;
        }
会引起E_STRICT警告:
Only variables should be passed by reference
    $result = $this->find($row, "{$this->pk} DESC",$this->pk);
    return array_pop( $result );
拆成两句即可解决。

2013-04-17 16:32:17

#2 coolhpy

这应该不算SP的问题吧

array_pop 的参数期望的是一个变量地址,而find的返回值并没有变量地址,所以才要先将值写到变量里吧。。。(这句是个人理解,求指正)

你如果用的不是array_pop,而是其他不是以引用方式来传递参数的函数,估计就不会出错了

2013-04-17 16:58:23

#3 jake

一般编程建议别开 E_STRICT ,这也是PHP官方的建议。

E_STRICT 主要是为了某些特定的场合使用的一个PHP配置。目前大部分开源程序,在E_STRICT都会有NOTICE提示。

PS:帖子将转移到BUG建议区

2013-04-17 20:09:18

#4 stalker

问题是E_STRICT看似级别很低   但是并不包括在E_ALL的范围之内  而一般php环境  即使是开发环境也不会专门屏蔽E_STRICT  如常见的E_ALL & ~E_NOTICE 要改成 E_ALL & ~E_NOTICE & ~E_STRICT才能屏蔽E_STRICT错误  而E_STRICT级别的主要作用不是屏蔽可有可无的不当编写习惯  而是提示建议不再使用或者已经被启用的函数   如ereg、eregi函数从5.3版本开始无法使用的问题   如htmlspecialchars函数从5.4版本开始需要指定语言编码的问题   如果屏蔽E_STRICT错误的话升级php之后遇到类似麻烦  想找出问题所在几乎是不可能的事情

以下是PHP官方对于E_STRICT的解释:
自 PHP 5 起引进了新常量 E_STRICT,其值为 2048。它提供了对用户代码的协同性和向前兼容性的运行时 PHP 建议,有助于使用户保持最新和最好的编程风格。例如在使用已过时的函数时 STRICT 信息会提出警告。

Note: E_ALL 不包括 E_STRICT,因此其默认未激活。

2013-04-18 10:34:00