新手学习PHP的避雷针,这些坑在PHP开发中就别跳了
不要!用记事本编辑php文件
早些年能用记事本编程是一些人自我吹嘘的资本,能用记事本编程就是牛逼的代名词。但是这里要告诫大家的是,千万不要使用Windows自带的记事本编辑任何文本文件。用Windows记事本编辑php文件会造成一些意想不到的错误,就是因为其给文件增加的bom头被php执行的时候当作了内容输出。
php是不支持有BOM的,php文件应该保存为UTF-8无BOM类型,所以在保存 UTF8 编码PHP文件时,不要使用 BOM。

不要!用@屏蔽错误消息
用@屏蔽错误消息的做法非常低效,我们可以使用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 并不需要文件末尾的闭合标签,并且我们可以通过去掉它来保证不会在后面添加任何的空白字符。这也是为什么我们在html模板中用<?php … ?>写php代码,而写php类文件只有<?php开头却没有?> 结尾的原因。
不要!滥用引用传递
按值传递中原来参数的值在调用其他函数之后还是原来的值,而引用传递则是改变了原来的值。

按照按值传递的做法来传值时,如果需要原来的值发生改变,则需要在进行代码复制,若是值够大或者是一大串字符串时,会使代码比较多,重复,而引用传递则不需要复制PHP代码,对提高性能这一个方面有很大的优势,但是其它情况下它使代码变得难懂,并且更难预测结果。
不要!在循环中执行查询
在循环中执行查询非常浪费。它给你的系统施加不必要的压力,并且可能能够在循环外部更快获得相同结果。当我遇到需要这样的情况时,我通常会使用两个分离的查询来解决问题,我会使用它们来构建数据数组。之后我会遍历数组,并不需要在这个过程中执行查询。我们应该时刻避免编写的程序与数据库有过多的交互,在循环中执行查询意味着每次循环都要执行相应的查询,数据库负担不起如此沉重的负担。
不要!依赖MySQL数据库
毫无疑问MySQL数据库在php编程中的重要性仅次于php语言本身,可以说没有MySQL就没有php今天的火爆,LAMP架构是刻在每一个phper骨髓里的。

php7发布以来,php的运行速度可以说突飞猛进,实测php7比php5性能提升了4倍,但是这并不能确定的说用php7开发的项目比用php5开发的项目性能能提升4倍,因为程序与MYSQL交互是有瓶颈的,不是程序有多少请求MYSQL就能处理多少,它在一些特殊情况下,如秒杀场景中MYSQL已经不适用,学会使用noSql数据库将会是必要的。
不要!重新发明轮子
PHP生态发展日趋完善,有许多优秀的轮子被制造出来并被免费分享,基本都是可以商业应用的,Github,码云,Packagist应该是我们亲密的伙伴,有什么需要,就先问问小伙伴有没有可以用的轮子吧。

另外别忘了Composer这个大管家(包管理器),在php开发中,只需要一行命令就可以让Composer为我们的项目安装一个轮子,并且找到这个轮子用到的轮子一并安装。
不要!信任用户的输入
信任用户的输入是不明智的。我们开发者并没有考虑每种可能性,它通常不正确,以及它可能是蓄意破坏。
对于用户的输入,前端验证、后端验证是用户输入验证的必须环节,千万不要只做前端验证或者只做后端验证。正确的做法是同时使用前后端验证,并且保持前后端验证队则一致。比如要求用户名必须为大于8位且不能包含特殊字符的字符串,这个条件就要在前后台都验证用户输入的长度不能小于8位,不能包含特殊字符。前端验证完毕允许用户提交数据,数据提交到后端再次验证,以确保输入数据的正确性。
不要!盲目觉得php是世界上最好的web编程语言
对于一个phper来讲,php是世界上最好的web编程语言,对于学习java、python、及其他编程语言可能会被认为这毫无意义,因为它们在你的舒适区和工作所需范围之外。但对于想进一步提升编程水平的朋友来说,是时候抛弃语言成见,重新认识编程开发,取百家之长,完善自己的知识体系。
每种语言都有一些要学习的实用的东西,以及从没碰到的新知识。这对于phper技能进阶尤为重要,通过不同语言的学习去总结编程思想,去印证php学习中的所学所想,会有一种豁然开朗的感觉。
新手学习PHP的避雷针,这些坑在PHP开发中就别跳了的更多相关文章
- 【c#新手学习 练习 案例】 阶段项目一:开发团队调度软件
案例是模仿java https://blog.csdn.net/bjfu170203101/article/details/109322590 改用C#:开发环境 vs2022/vscode .n ...
- c#面向对象基础技能——学习笔记(五)委托技术在开发中的应用
委托 delegate 1.是一种全新的面向对象语言的特性: 2.开发事件驱动程序变得非常简单: 3.简化多线程难度. 理解委托:可以理解成一个方法的指针.(接收的变量是方法) 步骤: 1.声明委托, ...
- 【Java EE 学习 24 下】【注解在数据库开发中的使用】【反射+注解+动态代理在事务中的应用service层】
一.使用注解可以解决JavaBean和数据库中表名不一致.字段名不一致.字段数量不一致的问题. 1.Sun公司给jdbc提供的注解 @Table.@Column.@Id.@OneToMany.@One ...
- javaWeb学习总结(11)- 监听器(Listener)在开发中的应用
监听器在JavaWeb开发中用得比较多,下面说一下监听器(Listener)在开发中的常见应用 一.统计当前在线人数 在JavaWeb应用开发中,有时候我们需要统计当前在线的用户数,此时就可以使用监听 ...
- 适合 JS 新手学习的开源项目——在 GitHub 学编程
作者:HelloGitHub-小鱼干 这里是 HelloGitHub 的<GitHub 上适合新手的开源项目>系列的最后一篇,系列文章: C++ 篇 Python 篇 Go 篇 Java ...
- 新手学习web遇到的一些乱码问题
在新手学习web网站学习的时候经常会遇到?????这种乱码,对于刚起步的菜鸟来说真的很头痛,很容易打击继续学的信心当然了对于菜鸟的我最近也遇到过乱码问题,沉浸其中不能自拔,爱的深啊!!!!!我所遇到的 ...
- ReactNative新手学习之路07ListView_ renderHeader使用StaticContainer
react native新手学习之路07ListView_ renderHeader使用StaticContainer 1.某些特殊场景需要用ScrollView滚动和ListView配合但是不幸运的 ...
- ReactNative新手学习之路01-创建项目开始
新手学习之路01-创建项目开始 小菜鸟准备学习RN开发,决定写下自己的学习历程,方便其他也想要学习RN的人,后期会持续更新写下自己所有学习经历,一步步从菜鸟成长成业内高手.开发环境准备,本文默认环境已 ...
- Python新手学习基础之初识python——与众不同2
看完了Python的缩进,现在来看看Python的标识符.引号和注释. 标识符 关于Python的标识符,其实不是与众不同,只是有一定的规则. 标识符是编程时使用的名字.在Python中,标识符有几点 ...
随机推荐
- Agri-Net POJ - 1258 prim
#include<iostream> #include<cstdio> #include<cstring> using namespace std; ; #defi ...
- 题解 AT3718 【[ABC081B] Shift only】
题目传送门 分析 直接暴力. 我们可以根据题意进行模拟,使用二重循环即可. 代码讲解 定义变量\(n\)和计数数组\(cnt\),再定义数组\(a\)并输入. int a[1000000]; int ...
- C#的结构和数组
下面我们继续学习C#的语法.结构struct,C#中的结构和我们PLC中建立的UDT(结构体)是一样的.里面存储了相关的不同类型的数据. 有一句话我觉得十分重要:方法是依存于结构和对象存在的.这以后我 ...
- 解决vmware每次打开无法上网
vmware网络配置好了,但是每次打开都无法上网,记录下 在计算机管理中启动这几个服务,就ok了
- Tickets HDU - 1260 简单dp
#include<iostream> using namespace std; const int N=1e5; int T,n; int a[N],b[N]; int dp[N]; in ...
- 拦截器 Filter : js、css、jpg、png等静态资源不被拦截解决方案
方案一: web.xml配置文件拦截范围缩小 ,没有必要 /*的配置拦截项目下所有资源. <filter> <filter-name>Login</filter-name ...
- HDFS写入数据
HDFS副本摆放策略 不同的版本副本摆放策略可能并不一致,HDFS主要采用一种机架感知(rack-ware)的机制来实现摆放策略. 由于不同的机架上节点间通信要通过交换机(switches),同一机架 ...
- loj6278 数列分块入门题2
题意:支持区间加,询问区间中元素排名 维护两个域.一个域维护原序列,一个域维护快内排序序列. 每次修改后更新快内排序序列. 修改时O(sqrt(n)log(sqrt(n))) 询问时O(sqrt(n) ...
- Java代码手段防止非法请求——防盗链
Java代码手段防止非法请求,思路如下: 1. 获取到当前请求的域名,如www.a.com 2. 获取到请求资源的上一个地址 3. 判断上一个地址是否为空,如 ...
- S3C2440的时钟原理
Crystal 无源晶体Oscillator 有源晶体(里面有有源器件) 无源晶振内只有一片按一定轴向切割的石英晶体薄片,供接入运放(或微处理器的XTAL端) 以形成振荡.有源晶振内带运放,工作在最佳 ...