迹忆博客
当前位置: 主页 > 学无止境 > 编程语言 > 文章

PHP坑 之 关联数组未定义键的使用

发布时间: 2018-10-18 作者: 迹忆 浏览次数:

在挖坑之前,请先允许我简单介绍一下场景。

我所在的项目组要重构一个项目,当时使用的是PHP5版本,要升级到PHP7。除了将PHP版本升级之外,同时要将自己开发的框架(不是很完善) 换成laravel框架。当然,本章介绍的坑不是由PHP版本升级导致的,而是由框架引起。

为什么要先简单介绍场景?首先,坑毕竟是由于本次重构导致的,我觉得有必要先说明一下;其次,个人觉得多数的坑并不是由于PHP本身语法的不完善导致的,反而是由于在不同的场景中,即使相同的代码都会产生不同的效果,甚至是错误,从而产生各种各样的坑,导致程序无法运行。综上,是我先介绍场景的原因。

程序出现问题,一定要结合场景(包括运行环境,框架等)去分析,而不是单纯的去看语言的语法问题。PHP发展到现在,语法上面几乎可以说是没有什么问题,出现问题的只是我们的使用。

好了,多的不说了,下面正式开始挖坑。

首先是下面一段代码(我简单来写) 

function operateOrder ($order)
{ 
    $oid = $order['orderId']; 
    $flag = $order['flag']; 
}

$order 是一个数组,在调用operateOrder 函数之前 $order是经过处理的,但是参数 flag 和 orderId 不同,flag不一定会存在。所以说上面的代码在flag不存在的情况下是会有异常的。

Notice: Undefined index: flag 
Call Stack: 
    0.0000     357696   1. {main}()  
    0.0000     357752   2. operateOrder($order = array ('orderId' => 11))  
PHP Notice:  Undefined index: flag in  
PHP Stack trace: 
PHP   1. {main}()   
PHP   2. operateOrder($order = array ('orderId' => 11)) 

但是我们发现,上面抛出的只是一个Notice异常,这种异常是不会终止程序运行的。无非就是变量 $flag 的值为NULL。加上我们的框架对异常的处理不是非常严谨。所以程序会继续运行下去。再加上我们使用的是定时任务执行相关的命令。所以,即使是notice信息也无法及时看到。从而就产生了一个假象,就是我们的程序能正常的运行。

当把上述代码原封不动的迁移到laravel框架中的时候,情况就不同了。因为 laravel框架对异常的处理非常全面,类似于上面的notice异常它也会捕获到然后抛出一个ErrorException,从而终止整个程序的运行。这样问题就暴露出来了,坑也就此形成了。

本身我们的业务是允许flag为空的,所以只要将上述代码稍微修改一下(非常简单)就能继续运行了。 

function operateOrder ($order)
{ 
    $oid = $order['orderId']; 
    $flag = $order['flag']??''; 
}

坑就这样被填平了,看起来也没什么啊。但是现实情况是类似与上面的地方相当的多,需要对照业务一个一个的添加默认值。

如果对于业务不是很熟悉,还得一边熟悉业务,一边看代码,一边修改。这么大的量手动一个一个的修改简直就是噩梦。

好了,到这我们的坑挖完了,也填完了。那可真是血的教训,在这想对大家说的是代码一定在开始的时候尽量规避掉一些潜在的问题。像上面的情况,在允许为空的地方给个默认值。这样就能避免类似事件再次发生。 

赞助
迹忆博客

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: