Chinaunix首页 | 论坛 | 博客
  • 博客访问: 214521
  • 博文数量: 42
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-09 10:55
个人简介

每天改变一点点,生活充满了惊喜。

文章分类

全部博文(42)

文章存档

2016年(8)

2015年(29)

2014年(5)

我的朋友

分类: PHP

2015-10-30 14:25:07

今天有小伙伴报了一个类似于这样的问题:
list($var1, $var2, $var3) = explode('_', $str);

上面这段代码在测试环境报PHP falal,日志是这样的:
[30-Oct-2015 11:38:29] php fatal error happen! [errno:8] [errstr:Undefined offset:  2]

很明显,意思是说,list在赋值的时候,没有找到数组索引为2的元素。
导致这个问题的原因是,explode产生的数组元素个数不足3个,
看到这里,我总觉得list没有那么脆弱,元素不够,总会有默认的处理方式,不至于报PHP fatal。
写了一段测试代码:
list($var1, $var2, $var3) = array(1, 2);

执行完,php-error没有任何的日志,实际的赋值效果和我预期的一样,$var3值为null。
var_dump($var1, $var2, $var3);
打印:
int(1)
int(2)
NULL

调整下php.ini 日志级别:
error_reporting  =  E_ALL | E_STRICT
(建议开发环境下,设置以上的错误日志级别,关注所有打印的错误日志。)
再执行,php_errror.log 打印:
[30-Oct-2015 14:05:31] PHP Notice:  Undefined offset:  2 ......

额,list 在赋值的时候,仅能用于数字索引的数组,并假定数字索引从 0 开始。
list($var1, $var2, $var3) = array(1, 2 => 2);
var_dump($var1, $var2, $var3);
打印:
int(1)
NULL
int(2)
看完上面的示例,你应该能明白 list 的赋值机制了, 当找不到对应的数组元素时,会打印一条Notice error log。

即使这样,应该也不会影响程序的执行,因为PHP 只有在打印 FATAL 级别日志时,才会中断脚本的运行。
这时候,我们可能会想到 函数 set_error_handler(),它用于自定义error 日志处理方式。
由于 PHP 弱类型的语法,致使很容易写出不够健壮的 PHP 代码,所以在我们的开发环境里,修改了错误日志的处理方式,
即使是 NOTICE 级别的error log,也变更为打印 FATAL 级别的日志,同时中断脚本的执行。

建议大家都这么做,即使是 NOTICE 级别的日志,也要做处理,以提升代码的健壮性。
另外要格外提醒一点,开发环境、调试环境、生产环境 要保持一致,
例如:PHP的版本号,日志级别的设置,等等。否则在查问题的时候,容易造成困惑。


阅读(2380) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~