关于PHP开发的9条建议


Posted in PHP onJuly 27, 2015

本文只是个人从实际开发经验中总结的一些东西,并不是什么名言警句,写出来有两个目的:一是时刻提醒自己要按照这些知识点来写自己代码,二是为了分享,说不定对你有用呢?万一,是吧。。。

1.首要意识:安全

大多数时候,我们开发的Web程序都是需要跟数据库打交道的,所以这里几乎可以说SQL注入是一个怎么也无法避免要拿出来讨论一下的问题。而且近年来像XSS和CSRF攻击也变得大行其道,使得"黑客"们貌似又有了一把把利器,而我们总是处于被动的状态。不过我们要记得是下面这两个原则:

1. 永远不要相信用户输入的东西。(老话了,但这是真的)
2. 将自己需要输出的数据进行转义。

简单来说就是:filter input , escape output

如果你是新手,不要再使用类似以下的查询语句了:

SELECT FROM users WHERE username = $_POST['username'] AND password = $_POST['password'];

还有就是,使用PDO或Mysqli吧,不要再使用老式的mysql操作了。

而对于,CSRF的解决方案,目前接触的都是给每一次的表单提交都设置一个token值,然后在表单提交的时候校验之即可。

2.明确地知道各个比较操作符的差别

PHP的比较操作符,这其实可以说是一个很小的注意点,但是在某些时候真的很重要。比如说很多时候我们得考虑清楚,该用==还是===,如果你使用过strpos()这个函数,下面的代码可能会给你一个直观的感受:

<?php

$authors = 'Chris & Sean';

if (strpos($authors, 'Chris')) {
  echo 'Chris is an author.';
} else {
  echo 'Chris is not an author.';
}

上面这段代码的运行结果其实是输出Chris is not an author,但是现实情况是,Chris & Sean真的是Author啊,怎么回这样呢?其实是这样的:Chris正好出现在Chris & Sean首位开始处,也就是0这个位置,所以substr()返回了,由于条件判断语句中bool判断,所以0作为了false处理,于是程序输出了Chris is not an author,但是在这种情况之下我们该怎么处理呢?我们其实可以这样的:

<?php

if (strpos($authors, 'Chris') !== FALSE) {
  echo 'Chris is an author.';
} else {
  echo 'Chris is not an author.';
}

这里的!==和!=的不同就体现出来了。

3.可以减少使用else就少使用else

这个貌似从我一开始接触编程就有的一个想法,因为每次看到if(){}else{}就有一种这一段其实可以写得更好的感觉,因为一旦你减少了使用else关键字,你得代码会减少两行!没错,两行也是我们的追求,而且,从我的经验看,else少的代码貌似可读性更高,对我来说。

if( this condition )
{
$x = 5;
}
else
{
$x = 10;

如果,在$x的默认值是10,还是下面这样写感觉比较好:

$x = 10;
if( this condition )
{
$x = 5;
}

4.去掉不必要的括号

这里的目的其实跟else关键字部分是一样的,我们是为了更简短的代码和更优越的可读性,对以下的情况,你都应该考虑优化代码:

if ($gollum == 'halfling') {
$height --;
}

其实是可以这样的:

if ($gollum == 'halfling') $height --;

你甚至可以这样:

if ($gollum == 'halfling') $height --;
else $height ++; 

if ($frodo != 'dead')
echo 'Gosh darnit, roll again Sauron';

foreach ($kill as $count)
echo 'Legolas strikes again, that makes' . $count . 'for me!';

是不是有一种又短又清晰的感觉?

5.多用str_replace()

在很多时候我们需要对一些字符串进行替换,在PHP中有以下几个函数可以达到这个目的:

str_replace()
ereg_replace()
preg_replace()

如果你确实是需要使用正则匹配,那就使用preg_replace(),而如果在可实现替换的情况下,请使用str_replace(),因为据不完全统计,str_replace()的效率在这三个当中是最高的。

6.使用三元运算符

这个可能很多人都有这个感受,使用三元运算符之后,我们可以去掉一堆if else语句了,代码又短又爽。

$host = strlen($host) > 0 ? $host : htmlentities($host);

7.使用缓存

目前PHP热门的缓存技术可能就是Redis和Memcached了,在PHP的官方文档中,也有Memcached的使用教程,至于Redis,我最近在研究中,后续会给出一些教程,如果一切顺利的话。

8.使用框架

框架的好处很多,可能是在性能方面有所损失外,貌似找不到不用框架的理由了,框架即可以加快你的开发速度,也可以让你在写代码的过程中撸的舒舒服服,而且想很多安全问题,你都会得到很好的解决。我这里首推Laravel,不过像Yii2 Slim Symfony都是非常棒的框架,除了Symfony没有尝过过之外,剩下的三个我都有使用经历,最后就基本是用Laravel了。不过我建议的Laravel可能不适合你,这还是得看个人喜好。

9.用isset()代替strlen()

如果你需要在项目代码中需要根据一个字符串的长度来做条件判断,这个时候非常推荐你直接使用isset(),因为在同等条件之后,isset()的速度是strlen()的五倍左右,所以:

<?php

if (isset($username[5])) {
  // The username is at least six characters long.
}


if (strlen($username) >= 6) {
  // The username is at least six characters long.
}

以上的两个条件判断都是可以达到相同的目的,但是我推荐使用的是第一种。

以上所述就是本文的全部内容了,希望大家能够喜欢

PHP 相关文章推荐
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
PHP 远程文件管理,可以给表格排序,遍历目录,时间排序
Aug 07 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
Aug 18 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
thinkPHP使用post方式查询时分页失效的解决方法
Dec 09 PHP
yii实现使用CUploadedFile上传文件的方法
Dec 28 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
PHP QRCODE生成彩色二维码的方法
May 19 PHP
PHP中的print_r 与 var_dump 输出数组
Jun 13 PHP
thinkPHP引入类的方法详解
Dec 08 PHP
PHP批量修改文件名称的方法分析
Feb 27 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
Laravel 中获取上一篇和下一篇数据
Jul 27 #PHP
php实现将Session写入数据库
Jul 26 #PHP
php检测文本的编码
Jul 26 #PHP
PHP中COOKIES使用示例
Jul 26 #PHP
PHP实现简单数字分页效果
Jul 26 #PHP
FastCGI 进程意外退出造成500错误
Jul 26 #PHP
php实现QQ空间获取当前用户的用户名并生成图片
Jul 25 #PHP
You might like
PHP之生成GIF动画的实现方法
2013/06/07 PHP
php获取文章上一页与下一页的方法
2014/12/01 PHP
ThinkPHP文件缓存类代码分享
2015/04/22 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
Laravel实现短信注册的示例代码
2018/05/29 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
Jquery 的outerHeight方法使用介绍
2013/09/11 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
Vue-cli4 配置 element-ui 按需引入操作
2020/09/11 Javascript
[02:36]DOTA2英雄基础教程 斯拉克
2013/11/29 DOTA
Python实现在matplotlib中两个坐标轴之间画一条直线光标的方法
2015/05/20 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
python简单实现AES加密和解密
2019/03/28 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
对Pytorch神经网络初始化kaiming分布详解
2019/08/18 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
pytorch GAN伪造手写体mnist数据集方式
2020/01/10 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
2020/01/20 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
pandas 数据类型转换的实现
2020/12/29 Python
利用CSS3参考手册和CSS3代码生成工具加速来学习网页制
2012/07/11 HTML / CSS
Html5之自定义属性(data-,dataset)
2019/11/19 HTML / CSS
计算机专业应届毕业生自荐信
2013/09/26 职场文书
软件工程专业推荐信
2013/10/28 职场文书
夜大毕业生自我鉴定
2013/10/31 职场文书
客户表扬信范文
2014/01/10 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
教师新年寄语
2014/04/03 职场文书
《实心球》教学反思
2016/02/23 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python