PHP 开发 「十宗罪」

前言

本文翻译自 10 Things Not To Do In PHP 7。全文列出了十条我们在 PHP7 开发中应注意避免的 反模式,觉得很有参考意义故翻译成中文供大家学习借鉴。

1. 不要使用 mysql_ 函数

在 PHP7 中,mysql_ 系列函数已经完全从核心代码中移除,你应该用改进过的 mysqli_ 系列函数(mysql improvement)来替换 mysql_ 代码。或者你也可以使用更具灵活性的 PDO 来重构你的程序。

2.不要写慢代码

PHP 7 中速度显著的增加可能会使你忽略一些糟糕的拖慢程序速度的代码,不要因为切换到 PHP 7 了而对这些问题漠不关心。
要了解网站速度的重要性以及如何让网站速度变得更快,请阅读 Beginners’ guide to speed optimization 以改进你的代码。
作为开发人员,你应该始终确保只在需要时才加载脚本,编写高效的数据库查询,尽可能使用缓存来加速访问等等。

3.不要在文件末尾添加 PHP 闭合标签

如果你阅读过 wordpress 源码,你就会发现大部分 PHP 文件末尾都省略了 PHP 闭合标签。而在 Zend 框架中特别 指明 禁止在文件末尾使用闭合标签。PHP 并不强制要求你添加闭合标签,在文件末尾省略它可以确保不会无意中添加额外的空格。

4.不要使用传递引用

我个人不喜欢使用传递引用。但在某些情况下传递引用是十分有用的,可是在大多数情况下,它会使代码更难阅读和理解,而且会出现难以预料结果。有些人认为使用引用可以使他们的代码更快,但实际上这是错误的
在 PHP 中使用传递引用的一个糟糕的例子可能就是 shuffle() sort() 函数。它们不是返回一个随机排序或排序过的数组,而是修改原来的数组,这在我看来是完全不合逻辑和反人类的。

5.不要在循环中执行查询

在循环中执行数据库查询完全就是在浪费资源。它会给服务器带来不必要的压力(译者注:循环中执行查询会导致 N+1 问题),并且你完全可以在循环之外得到相同的结果。当遇到这种情况时,你往往可以用两个单独的查询来得到一个结果数组,并对结果数组进行循环获取数据,并不需要在循环中执行查询。
解决这个问题的最好方法就是阅读函数文档并监控查询语句是否出现 N+1 问题。

6.不要在 SQL 查询中使用 *

在任何情况下,特别是数据库中包含大量列时,如果可以避免使用通配符,则不要在 SQL 查询语句中使用通配符。指明你想获取的数据列,能最大限度地减少资源的使用,保护你的数据并使代码逻辑清晰。
在写 SQL 语句时,尽量测试所有可能的实现并比较它们的速度。例如,使用 SQL 函数来计算平均值,总和而不是使用 PHP 函数来实现。

7.不要信任用户的输入

千万不要相信任何用户的输入!对用户所有的输入你都需要过滤,转义,检查。用户的输入很有可能是某些居心莫测的人恶意输入的带有 SQL 注入,XSS 恶意攻击的代码。
确保在使用数据库时,使用像 filter_var() 这样的内置函数来检查以及转义用户输入的值。

8.不要聪明反被聪明误

你的目标应该是写出优雅的代码,并清晰的表达你的意图,而不是炫耀你写代码的能力。你可以通过使用多级三元表达式或其他一些特别的技巧方法如通过将所有变量名变为单字母,从而使每个页面的加载时间减少 0.01秒。但日后你的代码将使你和你的同事花费数倍的时间去理解和维护。
恰当的命名你的变量,为每一行必要的代码写明注释,使用清晰的逻辑和面向对象方式书写代码。今天你花费在这些上面 “不必要” 的时间,在将来必将节省你数倍的维护时间并使你倍加感恩。

9.不要造轮子

PHP 已经有很长的历史了。在大多数情况下,你的需求往往都已经有人做出了实现。不要尝试去造轮子,造轮子前请先在 Github,Composer,Packagist 上搜索是否已经有相关的包。
从日志记录到取色器,从性能检测到单元测试,从微信接口到短信发送 API,只需要你阅读这些包的文档并简单的写几行代码就能完成需求,而不必大费周折自己写一个轮子。

10.不要忽略其他语言

虽然你是一个 PHPer,但你至少也要了解HTML,CSS,Javascript和 MySQL 的基本知识。
我也建议你学习有关面向对象的知识,它会使你的代码更优雅更赋予表达力。它也会为你打开学习 C#, Java 这类面向对象语言的大门。
学习包管理器,构建脚本,Coffeescript,LESS,SASS,YAML,模板引擎和其他工具来扩大你的知识面。衷心推荐你看看其他框架,特别是Ruby on Rails。
当你对这些知识都比较熟悉,那你也可以考虑考虑学习Typescript,Rust,Kotlin,Golang。
你往往会认为学习一门其他语言没有必要,这是因为在工作中用不到而且跳出了你的舒适区。但是每种语言都有它独特的东西值得你学习,这些不同思维编程语言的碰撞会让你对编程有更深的体会和感悟,并能让你在日后的编程中迸发出不一样的火花。所有顶尖 PHP 开发者绝对不会只熟悉 PHP 这一门语言。跳出你的舒适区,打破你的偏见,带着开放的眼光去看看外面的编程世界。
(译者注:这一点感受很深。PHPer 被黑的很惨的一个重要的原因就是很多 PHPer 基础并不是很好,往往只局限于PHP 这一门语言。建议大家有空多补补计算机相关基础,并多学习学习其他语言。并不止是职业上的考虑,扎实的基础和开阔的眼界往往能让你写出更好的代码。Laravel 这个框架也是作者借鉴了许多别的语言的精粹才写成的。他山之石,可以攻玉,共勉之!)

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 4

说不要造轮子我就不说啥了,但下面还提到微信接口,做过的人就知道那是个啥玩意儿。然后一好奇去看了英文原文,里面根本没微信什么事儿……

6年前 评论

@田勇 对呀,本来就是对原文有修改的基础上翻译的以更接地气。没按原文翻译是因为思维上的差异,英语好的可以点进去看原文。

6年前 评论
Destiny

总结的很好。:+1:

6年前 评论

应该说不要造无用的轮子,有创意的轮子总归要人去造

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!