前言

本文翻译自 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 协议》,转载必须注明作者和本文链接

PHP迸发,PHP 开发 「十宗罪」相关推荐

  1. Reddit高赞:机器学习领域「八宗罪」!同行评审变味,盲目崇拜盛行

    近日,Reddit社区一篇批判机器学习领域的文章引发了热议,获得了3.1k的赞.作者细数了机器学习领域存在的「八宗罪」,让科研人员对机器学习大环境有了新的思考. 越来越多的科研人员都选择进入机器学习这 ...

  2. Python「八宗罪」

    选自hackerfactor 作者:Neal Krawetz 机器之心编译 本文作者有一群 geek 朋友,经常一起讨论技术话题,有时候也会谈到编程语言.「I hate Python」,作者表示.他对 ...

  3. 哈哈哈哈,16 岁高中生开发「粤语编程」项目,在 GitHub 火了!

    点击上方 "编程技术圈"关注, 星标或置顶一起成长 后台回复"大礼包"有惊喜礼包! 每日英文 Everyone wants to escape sometime ...

  4. 火了!16 岁高中生开发「粤语编程」项目

    来自:机器之心粤语编程语言 --The Cantonese Programming Language.看来大家都是 C 语言啊. 最近十分搞笑的饮茶梗,刷新了大家对粤语的认知.其实粤语一直都是一个隐含 ...

  5. 16 岁高中生开发「粤语编程」项目,在 GitHub 火了!

    点击上方"Github中文社区",关注 触达Github项目 来自:github中文社区 大家好!我是Huber! 好听的粤语都能编程了! 最近十分搞笑的饮茶梗,刷新了大家对粤语的 ...

  6. 产品经理的「七宗罪」

    一直以来,产品经理与程序员之间就像是水与火般难以相融.许多初入社会的年轻开发,估计都曾动过要跟产品经理打一架的念想. 但这种坏念头一定只能压抑在心底,不然会被产品经理们通过一系列抓手对需求的底层逻辑的 ...

  7. 谷歌下架应用引争议,网友请愿 GitHub 开发「App Store」!

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 当地时间 1 月 29 日, Matrix  (一种用于实时通信的开放协议)客户端聊天应用程序 Element 毫无征兆地被 Googl ...

  8. 阿里云视频云「 vPaaS 」演绎了怎样的音视频应用开发「未来图景」?

    vPaaS是阿里云视频云最新推出的低代码音视频应用开发产品,其中,vPaaS低代码音视频工厂,彻底打破了音视频应用的繁冗技术开发壁垒:vPaaS视频原生应用开发平台,全新定义了音视频应用的开发方式. ...

  9. 破解这「七宗罪」,你才能晋升高级运营

    文章目录 一)注重投入产出比,摆脱低效 a. 边际成本递减 b. 规模化使用 c. 聚焦核心因素 二)保持灵活,减少浪费 a. 通过活动快速尝试 b. 不纠结于某个点 三)采取数据化思维,不再茫然 a ...

最新文章

  1. ios 学习常用网站
  2. 世界人工智能大会圆桌实录:AI与产业融合创新的挑战与机遇
  3. SpringCloud(第 017 篇)电影微服务接入Feign,添加 fallbackFactory 属性来触发请求进行容灾降级...
  4. linux slub分配器浅析
  5. java c++ python哪个好_程序员学java好还是python语言好 c++又如何
  6. django使用用户名或手机号码登录
  7. c语言学习进阶-C语言程序出错处理
  8. heavy dark--读《《暗时间》》
  9. eNSP------三层交换机配置(拓扑图+命令)
  10. 幻方解法之horse法生成奇阶幻方
  11. 斜杠认识// '\' '/'
  12. 安卓 体验linux mux,18000公里,MUX——“牧游侠”用车感受
  13. C#学习 - 关于协变(co-varianct)和抗变(contra-variant)
  14. 将jsp文件导入页面
  15. 事务Read Committed (读已提交)和Repeatable Read(可重复读)到底什么区别?
  16. 利用声网进行屏幕共享及关闭共享网络状态检测
  17. c语言do while语句用法6,C语言中while /do while语句用法
  18. Ui 组件库 (移动端)
  19. 短视频app开发:如何提高视频播放稳定性
  20. 买鸡卖鸡问题个人分析

热门文章

  1. vue一步一步带你封装一个按钮组件
  2. [html] 404页面有什么作用?
  3. [vue] 你知道nextTick的原理吗?
  4. [css] 如何解决css加载字体跨域的问题?
  5. [css] 除了可以用js跟踪用户信息外,如果不用js,使用纯css怎么做呢?
  6. 工作285:判断绑定逻辑
  7. 前端学习(2367):两种方式导航跳转和传参
  8. 前端学习(2226):react之组件
  9. 前端学习(1812):前端调试之shadow练习
  10. 前端学习(1605):组件传值