那些令人尴尬的BUG

在刚开始做PHP项目开发的时候,总会碰到一些神奇的BUG,这些BUG经过多次调试修改依旧存在,以至于我们这种菜鸟刚入门就很绝望。但这“BUG”最终被找到之后却让人哭笑不得,在这里就分享一下一些遇到的有意思的BUG。

程序内打印$username没问题,前台页面却死活不显示。

一般这种情况发生在大概以下的情况:

1
2
3
4
5
6
7
$username = 'Anglela';
var_dump($username); //没有发现问问题
//···
//···
//···
$this->assign('username', $useranme);
//然而页面上显示的就是不对

其实在中间某行原本的$username已经被换成了$useranme,有些编辑器对于类似于useranme,proflie这种单词手误拼写并没有提示,加上PHP配置上忽略了Notice,对于某些新手来讲,可能要找十几分钟甚至更久才找出问题所在。不过,这种问题对于英语还可以,用了智能IDE和php.ini配置合理的同学,基本上不会遇到,偶尔遇到基本也会轻松解决。

文件上传到服务器之后不生效。

当修改了某个文件后,在本地测试没有任何问题,传到服务器上却死活不生效。清除缓存、各种var_dump, dump, dd()最终还是没有找到问题所在,然后恍然大悟,MD,传错文件了/文件夹对应错了/传到了测试服务器!其实,这个问题大概率会发生在一个人同时做多个项目(打开多个FTP),修改完代码就往服务器传的情况下。这种情况就体现出代码部署规范的好处了,但往往中小型外包公司并没有严格的代码部署规范。

if判断的时候得到了意外的结果。

大致会是以下操作:

1
2
3
4
5
if ($var = 2) {
echo '走了if';
} else {
echo '走了else';
}

以上代码加了空格,可能一眼就能看出来if里面是=而不是==,这种情况一般比较少见,但也偶尔会碰到新手遇到这个问题,蛮有意思的。

以上问题基本都是因为自己的马虎或者规范问题导致的一些令人尴尬的“BUG”。不过对于PHP开发新手来讲,初期也可能因为对PHP语言了解的太少会触发很多意外的BUG。例如:

  • 比较两个浮点数之后发现总是得不到自己想要的结果。这个踩过一次坑或者在学习的时候认真看资料了基本上是不会遇到的。但实际上还是有很多新手不知道该用bcmath之类来进行比较。
  • try catch执行事务的时候发现走了try之后依旧会走catch,这个在ThinkPHP5.* 版本框架中见过几个人问过同样的问题,是因为大多在try中最后使用了TP自带的return $this->success('xxx');代码,然而这个success是继承的Exception,当然会被catch了。

类似的BUG在很多新手或者初级开发者身上时有发生,避免出现这些令人尴尬的BUG,最好的解决办法就是掌握好PHP的基础知识,从一开始做好代码规范(例如PSR-2)和开发规范,配合现在的强大IDE(例如PhpStorm之类的),基本可以避免以上绝大多数问题。