这篇文章是博主平时记的小笔记,记录的是平时开发没有注意到的细节,或者在写代码的时候可以优化的部分。有相当一部分bug都是开发中不够严谨造成的,所以大家共勉。提升代码质量,快乐撸码!
1、 代码的公用部分尽量不要改动,除非是所有的项目都需要添加某些新功能
2、 对于自定义的数组,对象等不同文件,要按照已有的文件分开。不要把对象定义到数组文件,数组定义到对象文件,方便调试和代码优化
3、 对于一些不必要的操作,无需发请求。比如我们的拖动排序事件。应该确保当顺序改变的时候再发送http请求。仅仅是拖动但没有改变位置的,不需要发送请求。这样在用户访问量比较多的情况下,不会有太大的访问压力
4、 构造函数要用起来。通用的变量,或者需要实例化的数据库部分都可以放里面。这样在脚本的其他地方使用很方便
5、 控制器中的方法名命名要更贴近实际功能,方便查看维护。
6、 不要为了方便,有些表单只在前端验证,而不去后端验证。因为用户可以通过禁用JS等方法,跳过你的前端验证,那么这个时候我们就无法保证系统的安全性,所以后端验证必不能少。在用户体验不是很重要的项目,系统的安全性更加重要。
举例: 用户修改密码,验证旧密码部分,如果只是前端通过JS验证,提交后的代码不加验证的话,用户可能会避过JS,从而直接修改密码,保证不了安全性
7、 比如我们在开发的时候,需要用到变量a。
if(xx){ $a=1; }else{$a=2};
$b = $a + 1;
类似于这种的,变量a没有预先定义,所以会成为notice错误。如果此时我们的服务器的错误级别是notice
都会报错的话,那么这部分就会成为bug。此时此刻再说“在我本地没问题啊”这种话将毫无意义,所以最好是在写程序的时候,就对自己严谨一些。
8、 关于代码兼容性。
在php 5.4下,可以正常使用可变变量,类似于:
$a = 'php';
$$a = '我是PHP';
echo $php;// 输出:我是PHP
这段代码在php5.4
下是可以的,但是在php 7.0
下会报错:Array to string conversion
。
这是因为php 5.4把($$a)中的$a当做一个整体,先解析$a = php ,然后通过第一个`$`符号,转化为( $$a == $php = 我是PHP )。但是在 php7.0,代码的严格性得到提升,此处必须使用 ${$a} 来区分解析的优先级,加个花括号标出来后面的变量,类似于咱们小学时候的加减乘除的优先级问题。
php文档地址: http://www.php.net/manual/zh/language.variables.variable.php
9、关于SVN或者git提交
代码在提交的时候,如果涉及到代码的重构,修复bug,优化等功能,那么最好是分多次提交。比如代码重构单独提交一次,修复Bug或者优化都单独提交一次。不要害怕提交的次数太多之类的,我们分的越细,等到出问题的时候,不管是直接定位问题所在还是回滚版本都会好操作很多。这也算是开发技巧之一吧。
======================= 2019年5月10日13时更新 ==============================
10、 在开发的时候,每用到一个变量,就要考虑到万一不存在这个变量,或者变量为空的时候,会不会影响到程序的正常运行?要在开发的时候就做好严谨的逻辑思考,加个条件判断并不会对程序的运行速度造成太大影响,但是不加这个条件判断,可能会造成程序崩溃。
11、 根据传过来的时间条件查询数据比实际数据少一天的情况?
首先,我本地的时间字段是datetime,那么2019/03/25会自动转化为2019/03/25 00:00:00,所以才出现查询数据少一天的情况。如果本地的时间字段类型是date,那么查询的时候,可以不用再拼接23:59:59也能正确得出结束时间当天的数据。
拼接的方案:
当本地日期字段类型是datetime
,使用between and
查询时间区间的时候,需要记得,如果传过来的日期是:2019/03/25 -- 2019/03/27
这种的,那么直接转化为时间戳的话,结束时间是2019/03/26 23:59:59
,相当于27号那天的数据我们是查不到的。所以需要在接收的时候,
做一下转换:
$time_start = isset($this->db_g_data['time_start']) ? date("Y-m-d 00:00:00", strtotime($this->db_g_data['time_start'])) : "";
$time_end = isset($this->db_g_data['time_end']) ? date("Y-m-d 23:59:59", strtotime($this->db_g_data['time_end'])) : "";
这样相当于重新把日期转化为格式化的时间,同时给起始时间一个00:00:00
,给结束时间一个:23:59:59
。
12、 使用传引用后,记得unset掉引用的部分 :https://segmentfault.com/a/1190000014126990
13、 关于php内存方面的优化也值得注意,循环能少则少,判断条件要在循环体之外:
参考:https://blog.csdn.net/LJFPHP/article/details/90053455
======================= 2019年6月2日20时更新 ==============================
1、 对于php
程序,有些if{}else{}
是可以缩减的,if{}else{}
多了也代表着代码的冗余,要谨记
2、 比如要查询当前时间往后,1天,5天,10天的数据。如果你每次都循环查询,0-1,0-5,0-10
,那么查询是有冗余的,而且查询速度会越来越慢。这个时候应该选用:0-1,2-5,6-10
这个时间区间来查询,这样会节省不少时间。
3、 intval
还是少用,如果在单纯的计算中,比如:12.22 / 1.1
这种,用intval
就会计算不准确,特别是在循环中,数据会越来越不准确。在计算的时候,要么采用精度计算,要么采用sprintf
来格式化
4、 在写代码的时候,要考虑一个问题,假如有100W
的数据,你的代码能跑的动吗?优化在于开始写之前,而不是开始写之后。
5、 对文件命名的时候,不要带上项目的名字,因为多个项目的话,可能会共用同一个文件。
6、 代码精简,一些判断条件,要注意是否重复。比如你在sql
里面限制 x字段为1
,那么下面的逻辑中就没必要判断 if(x ==1)
这种情况,因为我们用的结果集是从数据库中拿的,已经筛选过了。
=============== 2019/6/18===========================
1、 删除文件部分的代码,如果没有删除目录的需求,那最好是去掉删除目录的方法,防止传入目录是‘/’
,直接把服务器上的目录都给删掉。
如果有需求的话,就在方法里面增加固定的路径前缀:比如:'/var/www/a/b'
等,限定只能删除b
目录下的目录文件。
2、 如果是用到网络上的代码,那么最好是先检查下,像curl
,file_get_contens
等代码尽量不要有,防止网上的文件带有漏洞后门之类的东西。
3、 尽量不要把数据都在首页全部查出来,这样的话,可能后续打开页面什么的会少一些网络请求,但首页加载速度慢有可能会在一开始就把用户拒之门外,所以哪里用哪里请求就行,特别是对于一些不用频繁打开的页面数据,更应该用的时候才查
4、 注意使用的函数是否必要,比如我们上传图片经常会使用iconv
函数来进行字符编码转换,把utf-8
转化为gbk
的格式,防止保存的图片名称是乱码。但如果我们规定图片名称是英文或者字符串,那就没必要使用这个函数了,使用该函数只会让代码变得冗余难读。因此要根据业务进行选择。
5、 测试一定要细心,想到哪点可能会有问题,那就果断去测试。因为如果每次都是你出bug
,那么你在其他人心中的权威性会越来越低,最后导致只要出问题就找你,但其实未必是你的问题。
6、 当引用样式或者引用接口链接的时候,本地写的是http
开头的。但是服务器上是https
环境的,所以放上去自然找不到我们想要的内容。为了能让本地正常测试,并且上传服务器上也能正常使用,所以选用://xxxx.com/css
的方式,
即使用//代替。
参考: https://www.jianshu.com/p/b85b048dc2fb
好处是可以自己根据页面协议自己选用协议,在以后升级程序的时候也方便
7、 对于大型项目来说,有时候更新一次版本可能需要几分钟或者几十分钟,如果是不停机发版,那么用户在发版期间访问项目可能会出现一些问题。所以可以采用ab
发版分方法,比如根目录是htdocs
,可以在根目录同级新建a
目录和b
目录,这三个目录的内容是相同的。然后用软连接自动连接htdocs-->a,
当我们发版的时候,会根据软链接的位置,自动发布到b
版本,此时不会影响用户的正常访问。当发版结束后,切换htdocs-->b
,让根目录软连接到b
,此时用户即可正常使用使用新功能。然后再同步a
目录和b
目录保持一致即可,如此便解决了发版过程中可能遇到的问题。
8、 写代码的时候,要考虑内存峰值,遇到大数组相关的,处理完要及时unset
掉,尽量不要两个大数组进行循环或者传值,这样如果数组很大,接近于内存峰值,那么循环的时候则会造成内存溢出问题。最好是优化业务,使用一个大数组之后,要及时unset()
掉。
9、 编码的时候要注意代码格式
ctrl + alt + L 可以自动排版
ctrl + alt + O 自动删除无用的类引用
这2
个写代码的时候, 随时摁一下,文件编码: utf8
, 每行缩进4
个空格, 不要用tab
10、 mysql
的update
更新,如何判断是数据重复还是修改错误
对于php来说,执行mysql的update操作的时候,经常需要根据返回值来进行操作。但是当我们使用如下:
r e s = " u p d a t e x x x x x " ; i f ( res = "update xxxxx"; if( res="updatexxxxx";if(res){
}else{
}
使用这种方式进行判断,那么会不能区分sql
执行错误和数据重复问题,因为当数据完全重复的时候,update
操作返回的是0
,代表受影响的行数。
此时可以采用 ===的方式来判断返回的是0还是false,返回false代表update语句操作错误:
if($result > 0 || $result === 0){
//如果修改的数据和原数据一样的话,返回的是false
}else{
}
写一次博客也是重新看一遍记录的这些问题。愿以后的代码可以少出bug,哈哈。共勉!
end