|
PHP 程序开发最坑的序开地方不是语法,是序开版本。你本地跑 PHP 8.2 一切正常,序开往服务器上一扔,序开PHP 7.4 直接白屏。序开连个错误都不给,序开就白屏。序开我第一次遇到这事的序开时候查了整整一个下午,最后发现是序开一个箭头函数惹的祸。PHP 7.4 不支持 fn() 这种写法,序开得老老实实写 function() use()。序开 所以后来我养成一个习惯:先看 phpinfo(),序开再动手写代码。序开别笑,序开这真能省命。序开很多人上来就 composer require 一堆包,结果框架要求 PHP 8.1,服务器还跑着 7.2,composer 倒是不报错,装完了运行就炸。你说这怪谁。 变量和数组,PHP 的命根子 PHP 的数组是个万金油。它既可以是 list,也可以是 map,还能嵌套成树。方便是真方便,坑也是真坑。array_merge 和 + 运算符的区别,我见过工作三年的开发者还搞混。array_merge 遇到相同的字符串键会覆盖,数字键会重新编号;+ 运算符则是保留左边的,右边同键的直接丢掉。这俩行为完全不一样,但写出来都像是“合并两个数组”。 有次改一个购物车逻辑,用户反馈说加了两次同一商品,数量没累加。我一看代码,用的 $a + $b。改成 array_merge_recursive 也不对,那玩意儿会把数量变成数组。最后还是老老实实 foreach 手动累加。PHP 的数组函数多如牛毛,但真到了业务逻辑里,手写循环往往最稳。 字符串处理,别太相信函数名 strpos 返回的是位置,如果匹配在开头,返回 0。0 在 if 里是 false。所以判断“是否包含”必须用 !== false。这个坑每年都要绊倒一批新人。我面试别人的时候就爱问这个,答不上来的基本可以判断没怎么写过真实项目。 还有 str_replace,它是全部替换。想只替换一次?没有内置函数,得用 preg_replace 加限制参数,或者自己写。PHP 的字符串函数命名混乱,strstr、strchr、strrchr 长得像三兄弟,功能却各不一样。我到现在记不住 strstr 的第三个参数是干嘛的,每次都得查文档。 数据库操作,PDO 是底线 还在用 mysql_query 的,我建议直接重写。PDO 的预处理语句不是可选项,是必选项。SQL 注入这事,只要有一个入口没过滤,整个库都可能被拖走。我之前接手过一个老项目,登录处直接拼接 $_POST['username'],我试了一下 ' OR '1'='1,直接进了后台。那感觉,又爽又怕。 PDO 的 bindValue 和 execute 数组传参也有区别。数组传参默认全是字符串,如果你字段是整型,MySQL 在严格模式下可能报错。bindValue 可以指定 PDO::PARAM_INT。这个细节平时没事,一开严格模式就现原形。 错误处理,别把 warning 不当回事 PHP 的 E_WARNING 默认不中断脚本。很多人开发时关了 display_errors,上线后日志里一堆 warning 也不看。结果某个变量没定义,拼出来一个空字符串,逻辑悄悄跑偏。我现在的做法是:开发环境 error_reporting(E_ALL),并且把 warning 转成异常抛出来。用 set_error_handler 几行代码就能搞定。逼着自己把每个 warning 都修掉,代码质量能上一个台阶。 PHP 程序开发没什么高深的东西,就是把版本、数组、字符串、数据库、错误处理这几件事一件一件搞明白。搞明白了,写出来的代码就稳。搞不明白,那就天天加班查 bug。 |