spModel类在php5.3下一个E_STRICT警告
发布于:2022-01-17 09:50:54
#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