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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元组、字典、集合的常用方法

一、元组类型 1、定义 t1 () print(t1, type(t1)) # 参数为for可以循环的对象(可迭代对象) t2 tuple("123") print(t2, type(t2)) t3 tuple([1, 2, 3]) print(t3, type(t3)) t4 tuple((7, 8, 9)) print(t4, type(t4)) # 思考:如何定义一个只有一个值的元组 # &qu…

(转)看盘ABC:看盘七大指标

(转)看盘ABC:看盘七大指标 投资大师巴菲特说过一句话:投资是一场马拉松赛,获得冠军的前提是要跑完全程。在这场马拉松赛中,您能跑完全程吗?以往无数股民的经历表明,中途惨败出局者不计其数。为…

[vue] 说说组件的命名规范

[vue] 说说组件的命名规范 定义组件名有两种方式: 1.kebab-case(短横线分隔命名),引用时必须也采用kebab-case; 2.PascalCase(首字母大写命名),引用时既可以采用PascalCase也可以使…

php梯度区间计算,快速计算梯度的魔法--反向传播算法

2.1 计算梯度的数值方法第一次实验我留的一个课后作业里问你是否能够想出一个求解梯度的办法,其实不难想到一种简单的办法就是使用“数值法”计算梯度。办法很简单,就是对于损失函数中的一个初始取值为a0的参数a,先计算当前的损失函数值J0,再保持其他参数…

SpringCloud的学习记录(1)

最近一段时间重新学习一边SpringCloud,这里简单记录一下。 我用的是IntelliJ IDEA开发工具, SpringBoot的版本是2.1.3.RELEASE。 1. 构建Maven项目 整个的SpringCloud的项目是在Maven项目中的,这个Maven只做容纳其他项目使用, 比如后面Fegin/Config/Zipk…

[转]URLRewriter使用通配符

网上有很多写这个组件使用的文章,如何使用我就不细述了,有关在 ASP.NET 中执行 URL 重写的文章请看下面链接:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx?mfrtrue 我这里要说的是其中几个很容易被忽视的小细节…

[vue] 在vue中使用this应该注意哪些问题?

[vue] 在vue中使用this应该注意哪些问题? vue中使用匿名函数,会出现this指针改变。 解决方法 1.使用箭头函数 2.定义变量绑定this至vue对象个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但坚持一定很酷。欢迎大…

oracle逻辑备份和物理备份,Oracle备份与恢复介绍(物理备份与逻辑备份)

3、逻辑备份之EXP/IMP:EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。EXPDP和IMPDP是服务端的工具程序,他们只能在ORACLE服务端使用,不能在客户端使用。IMP只适用于EXP导出的文件,…

作业-python常用库类 numpy+pandas

# -*- coding:utf-8 -*-# 1,一个四维的数组,以后两维度为单位,计算它们的和,比如一个1*2*3*4的数组,合并后两列,输出合并后的轴的sum# 实例,输入:[[[[2 7 9 7] [6 6 8 2] [0 0 9 3]][[5 4 1 4][5 7 9 7] [8 4 1 4]] ]] 输出[[59 59]]# import numpy as np# anp.array([[[[2,…

ICE专题:ICE起步

ICE初步 最早开始接触ICE是在2005,3月份,当时一个朋友向另一个正打算研究corba的朋友强烈的推荐了ICE. 参考:http://www.zeroc.com/ 1.什么是ICE? ICE(internet communications engine)是适用于异种环境的面向对象中间件平台。 那么什么是中间件呢? 比较流行的定义是:中间件是…

[vue] 你有使用做过vue与原生app交互吗?说说vue与ap交互的方法

[vue] 你有使用做过vue与原生app交互吗?说说vue与ap交互的方法[vue] 你有使用做过vue与原生app交互吗?说说vue与ap交互的方法 我的做法就是让app在webview把app的方法暴露在window上让前端调用、反之app调用前端的方法也需要前端把方法暴露在window上(w…

[vue] 使用vue写一个tab切换

[vue] 使用vue写一个tab切换 v-for循环&#xff0c;利用下标和v-show显示<div id"app"><ul class"tabs"><li class"li-tab" v-for"(item,index) in tabsParam" click"toggleTabs(index)" :class"index…

subversion安装与配置备忘录

subversion安装与配置备忘录 前两天给公司安subversion,总是出问题,今天总结一下整个过程,以备将来遗忘.下边是我对在网上的一些文章的添加和补充基础上写的. 我是安装windows版本的subversion,所以先把linux下的简介一下: 1.下载httpd-2.0.*.tar.gz(http://www.apache.org)源代…

html5 拖拽上传文件时,屏蔽浏览器默认打开文件

参考&#xff1a; https://www.cnblogs.com/kingsm/p/9849339.html 转载于:https://www.cnblogs.com/cwxwdm/p/10605529.html

[vue] vue中什么是递归组件?举个例子说明下?

[vue] vue中什么是递归组件&#xff1f;举个例子说明下&#xff1f; 组件自己调用自己&#xff0c;场景有用于生成树形结构菜单个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通…

oracle仲裁磁盘是一块磁盘吗,基于ASM冗余设计的架构,仲裁磁盘组应该如何去规划?...

ASM使用独特的镜像算法&#xff1a;不镜像磁盘&#xff0c;而是镜像盘区。作为结果&#xff0c;为了在产生故障时提供连续的保护&#xff0c;只需要磁盘组中的空间容量&#xff0c;而不需要预备一个热备(hot spare)磁盘。不建议用户创建不同尺寸的故障组&#xff0c;因为这将会…

如何判断SVG事件对象中的鼠标来源?

在SVG中会经常遇到判断鼠标事件来源的问题&#xff0c;比如&#xff1a;鼠标单击或者双击、滚轮事件等等。这里做一个简单的介绍。 判断鼠标是左键还是右键&#xff1f; 在onclick事件中&#xff0c;if(evt.button0)则为左击&#xff0c;否则为右击 无论单击还是双击evt.detail…

电商 APP 下单页(俗称车2) 业务流程概要设计

购物车是电商APP的一个关键功能点&#xff0c;一般购物车包含 3&#xff5e;4 个页面&#xff0c;分别是&#xff1a; 1.购物车的商品列表页 2.商品下单页 3.订单付款页面 4.订单付款成功页面 由于现有购物车逻辑相对混乱&#xff0c;这里重新整理一下商品下单页的业务流程设计…

[vue] 怎么访问到子组件的实例或者子元素?

[vue] 怎么访问到子组件的实例或者子元素&#xff1f; this.$refs个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

php求数组交集的自定义函数,php数组交集函数

在数学中的交集运算&#xff0c;大家在学习的时候还是比较轻松的。我们在php数组里&#xff0c;可以借助array_intersect()函数对两个数组求交集&#xff0c;最后得到一个想要的交集数据。在正式开始array_intersect()使用前&#xff0c;我们需要先对函数的概念、语法、参数、返…