新手学习PHP的避雷针,这些坑在PHP开发中就别跳了

rockman 后端 2019-07-12

新手学习PHP的避雷针,这些坑在PHP开发中就别跳了。

不要!用记事本编辑php文件

早些年能用记事本编程是一些人自我吹嘘的资本,能用记事本编程就是牛逼的代名词。但是这里要告诫大家的是,千万不要使用Windows自带的记事本编辑任何文本文件。用Windows记事本编辑php文件会造成一些意想不到的错误,就是因为其给文件增加的bom头被php执行的时候当作了内容输出。

php是不支持有BOM的,php文件应该保存为UTF-8无BOM类型,所以在保存 UTF8 编码PHP文件时,不要使用 BOM。

新手学习PHP的避雷针,这些坑在PHP开发中就别跳了

不要!用@屏蔽错误消息

用@屏蔽错误消息的做法非常低效,我们可以使用error_reporting(0)来关闭错误报告。如果觉得每行这样写麻烦,还可以配置php.ini文件,搜索display_errors = on,默认是on表示开启报错功能,改为off。

其实我们应该正视编程中的所有所有错误级别的错误,在开发环境中,处理注意(Notices)、警告(Warnings)、致命错误(Fatal errors)的所有错误,现在thinkphp、laravel都是默认开启error_reporting(E_ALL)的,那么咱们就别掩耳盗铃,用@屏蔽错误消息。

变量比较不要!用==

字符串是否相同建议用 === 而非 ==,因为这个比较是弱类型。两个值比较时,PHP会先尝试判别左右两者是否为数字。在数值类型与字符串比较时,甚至一些数字开头的非数值串,比如 12=='12这个串' 得到的值也会是 true。这些情况下,可能会使本来并不相同的字符串被判定为相等。而使用===比较则为包含类型的比较,不会有任何转换,所以是可以准确比较字符串是否相同的。

不要!忽略单引号双引号的区别

PHP在双引号包围的字符串中搜寻变量,单引号则不会。双引号里面的字段会经过编译器解释后之后输出,单引号里面的不进行解释,直接输出。要输出的字符串有和变量重名的,就必须用单引号避免解析。

不要!使用退出历史舞台的 mysql_ 函数家族

PHP 7已经把mysql_ 函数从核心中全部移除了,你需要开启mysqli扩展或者pdo_mysql扩展,如果使用的Laravel则必须开启pdo_mysql扩展。也就是说你需要迁移到mysqli_函数,或者更灵活的PDO实现。

新手学习PHP的避雷针,这些坑在PHP开发中就别跳了

文件末尾不要!使用PHP闭合标签

php手册中标记章节告诉我们php代码都会以<?php … ?>的形式开头结尾。但如果内容是纯 PHP 的代码文件,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记?>之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。

PHP 并不需要文件末尾的闭合标签,并且我们可以通过去掉它来保证不会在后面添加任何的空白字符。这也是为什么我们在html模板中用<?php … ?>写php代码,而写php类文件只有<?php开头却没有?> 结尾的原因。

不要!滥用引用传递

按值传递中原来参数的值在调用其他函数之后还是原来的值,而引用传递则是改变了原来的值。

新手学习PHP的避雷针,这些坑在PHP开发中就别跳了

按照按值传递的做法来传值时,如果需要原来的值发生改变,则需要在进行代码复制,若是值够大或者是一大串字符串时,会使代码比较多,重复,而引用传递则不需要复制PHP代码,对提高性能这一个方面有很大的优势,但是其它情况下它使代码变得难懂,并且更难预测结果。

不要!在循环中执行查询

在循环中执行查询非常浪费。它给你的系统施加不必要的压力,并且可能能够在循环外部更快获得相同结果。当我遇到需要这样的情况时,我通常会使用两个分离的查询来解决问题,我会使用它们来构建数据数组。之后我会遍历数组,并不需要在这个过程中执行查询。我们应该时刻避免编写的程序与数据库有过多的交互,在循环中执行查询意味着每次循环都要执行相应的查询,数据库负担不起如此沉重的负担。

不要!依赖MySQL数据库

毫无疑问MySQL数据库在php编程中的重要性仅次于php语言本身,可以说没有MySQL就没有php今天的火爆,LAMP架构是刻在每一个phper骨髓里的。

新手学习PHP的避雷针,这些坑在PHP开发中就别跳了

php7发布以来,php的运行速度可以说突飞猛进,实测php7比php5性能提升了4倍,但是这并不能确定的说用php7开发的项目比用php5开发的项目性能能提升4倍,因为程序与MYSQL交互是有瓶颈的,不是程序有多少请求MYSQL就能处理多少,它在一些特殊情况下,如秒杀场景中MYSQL已经不适用,学会使用noSql数据库将会是必要的。

不要!重新发明轮子

PHP生态发展日趋完善,有许多优秀的轮子被制造出来并被免费分享,基本都是可以商业应用的,Github,码云,Packagist应该是我们亲密的伙伴,有什么需要,就先问问小伙伴有没有可以用的轮子吧。

新手学习PHP的避雷针,这些坑在PHP开发中就别跳了

另外别忘了Composer这个大管家(包管理器),在php开发中,只需要一行命令就可以让Composer为我们的项目安装一个轮子,并且找到这个轮子用到的轮子一并安装。

不要!信任用户的输入

信任用户的输入是不明智的。我们开发者并没有考虑每种可能性,它通常不正确,以及它可能是蓄意破坏。

对于用户的输入,前端验证、后端验证是用户输入验证的必须环节,千万不要只做前端验证或者只做后端验证。正确的做法是同时使用前后端验证,并且保持前后端验证队则一致。比如要求用户名必须为大于8位且不能包含特殊字符的字符串,这个条件就要在前后台都验证用户输入的长度不能小于8位,不能包含特殊字符。前端验证完毕允许用户提交数据,数据提交到后端再次验证,以确保输入数据的正确性。

不要!盲目觉得php是世界上最好的web编程语言

对于一个phper来讲,php是世界上最好的web编程语言,对于学习java、python、及其他编程语言可能会被认为这毫无意义,因为它们在你的舒适区和工作所需范围之外。但对于想进一步提升编程水平的朋友来说,是时候抛弃语言成见,重新认识编程开发,取百家之长,完善自己的知识体系。

每种语言都有一些要学习的实用的东西,以及从没碰到的新知识。这对于phper技能进阶尤为重要,通过不同语言的学习去总结编程思想,去印证php学习中的所学所想,会有一种豁然开朗的感觉。

以上。

大家在php开发过程中还踩过那些坑呢,欢迎留言交流。

评论