php编码习惯总结

PHP的编码规范
https://github.com/PizzaLiu/PHP-FIG

1. php变量、函数、类、文件名命名要有意义

  1. 不用语言关键字
  2. 命名要有实际含义
  3. 命名风格保持一致
  4. 不用拼音命名

2.适当的使用注释

终极要求:代码就是注释

  1. 好的代码应该是自描述的
  2. 难以理解的地方加上注释
  3. 函数的功能加上注释说明
  4. 类的功能和使用方法加注释

3.多备份重要的代码

  1. 代码不能只有一份
  2. 启用编辑器的自动备份
  3. 用代码管理工具备份

4.坚持字符编码统一

PHP文件编码 == 模版编码 == 数据库编码

5.使用之前,变量要初始化

使用一个未定义的变量, 比使用一个定义好的变量要慢8倍以上!

可以相像 , PHP引擎会首先按照正常的逻辑来获取这个变量 , 然而这个变量不存在 , 所以 PHP引擎需要抛出一个 NOTICE, 并且进入一段使用未定义变量时应该走的逻辑 , 然后返回 一个新的变量.
另外 , 阅读代码的角度讲 , 当你使用一个未定义的变量时 , 会让阅读你代码的人困惑 :”这 个变量在那里初始化的 , 和之前的代码有关系么 ? 和 include进来的文件有关系么

function getInfo($arrId){
    $ids = implode(',', $arrId);
    $query = mysql_query("select * from test where id in ($ids)");
    while($info = mysql_fetch_array($query)){
	    $info['name'] = trim($info['name']);
	    $info['addr'] = trim($info['addr']);
	    $list[] = $info;
    }
    return $list;
}

function getInfo($arrId){
    $list = array();
    $ids = implode(',', $arrId);
    $query = mysql_query("select * from test where id in ($ids)");
    while($info = mysql_fetch_array($query)){
	    $info['name'] = trim($info['name']);
	    $info['addr'] = trim($info['addr']);
	    $list[] = $info;
    }
    return $list;
}

6.使用 NULL === 来代替 is_null

is_null和 NULL === 完全是一样的效果, 但是却节省了一次函数调用.

7.尽量使用 === 尽量不用 ==

PHP有俩组相等比较运算符 === / !== 和 == / != , == / != 会有隐式类型转换, 而 === / !==
会严格比较俩个操作时是否类型相同并且值相等.

8.避免在 for循环中计算

for($i=0; $i<strlen($str); $i++) {
}

会导致每次循环都调用strlen, 改为

$j=strlen($str);
for ($i=0; $i<$j; $i++) {
}

9.strtr替代

$subject = 'hello, world';
echo strtr($subject, array('hello'=>'world', 'world'=>'hello'));
echo str_replace(['hello'=>'world'], ['world'=>'hello'],$subject);

strtr 是str_replace的4倍

10.优先使用单引号

$row[‘id’] 的效率是 $row[id] 的7倍

11.header头的编码

header("Content-type: text/html;charset=utf-8");

12.php结束标记不要写

纯 PHP 代码,最好在文件末尾删除 PHP 结束标记

13.测试环境开启所有错误

error_reporting(7)
1:E_ERROR
2:E_WARNING
4:E_PARSE
但切记,上线之后要关闭我们的报错,将我们的错误代码写入到错误日志中,方便查错

14.屏蔽错误非常低效

养成不用 @ 的好习惯

$handle = @file('a.txt');

15.用 FALSE表示错误 , 用 NULL表示不存在

对于操作类的函数, 失败返回FALSE, 表示”操作失败了”, 而对于查询类的函数,
如果找不到想要的值, 则应该返回NULL, 表示”找不到”.

16.优先使用 PHP内置函数

正则耗时, 尽量避免, 而采用直接的字符串处理函数代替, 如:

filter_var('zhangsan@163.com', FILTER_VALIDATE_EMAIL);
有用的 PHP内置函数
usort — 使用用户自定义的比较函数对数组中的值进行排序
rawurlencode — 按照 RFC 1738 对 URL 进行编码
parse_url — 解析 URL,返回其组成部分
http_build_query — 生成 URL-encode 之后的请求字符串
exif_imagetype — 判断一个图像的类型
uniqid — 生成一个唯一ID
get_browser — 获取浏览器具有的功能
str_word_count — 返回字符串中单词的使用情况
我们 php手册中常见的字符串函数和数组函数,也需要熟悉,优先使用

17.防御式编程思想

不要相信外部的一切输入! 所有的输入都要检查!
$username = htmlspecialchars($_GET['username']);

18.常见的 PHP的语法糖

echo(), print(),die(),isset(),unset(),include(),include_once(),requ
ire(),require_once(),array(),list(),empty(),eval()

19.echo的逗号和点号

逗号优于点号

$foo = 'hello';
$bar = 'world';
echo $foo . $bar;
echo $foo , $bar;

20.判断字符串的长度

strlen()函数函数执行起来相当快,只返回在zval 结构中存储的已知字符串长度。
但是由于strlen()是函数,多多少少会有些慢

$str = 'hello';
if (strlen($str) === 5) echo 'do sth...';
if (!isset($str[5])) echo 'do sth..';

21.使用 []代替

$arr = array();
$arr = [];
$arr = array(1,2,3,4);
$arr = [1,2,3,4];

22.用 … 定义变长参数函数

function addAll(...$num){
	$sum = array_sum($num);
	return $sum;
}
addAll(1,2,3,4,5,6,7);

23.不用eval()

eval() 能够执行所有的php代码,非常的危险!慎用!

eval('echo `pwd`;');

24.PHP代码的优化

if代码块的优化
<?php
if ( 1 == $orderState ) {
	$status = 'success';
}else{
	$status = 'error';
}
return $status;
#### 完全可以简化成如下代码
$orderState = 'error';
if ( 1 == $orderState ) {
	$status = 'success';
}
return $status;
使用三元运算符来替换
<?php
	if ( !empty($_POST['action']) ) {
		$action = $_POST['action'];
	}else{
		$action = 'default';
	}
	#### 完全可以简化成如下代码
	$action = !empty($_POST['action']) ? $_POST['action'] : 'default';
中间结果赋值给变量
<?php
$str = 'this_is_test';
$res = implode('', array_map('ucfirst', explode('_', $str)));

#### 完全可以简化成如下代码

$str = 'this_is_test';
$words = explode('_', $str);
$uWords = array_map('ucfirst', $words);
$res = implode(' ', $uWords);
使用更加精悍短小的代码
  • 函数的最佳最大长度是 50-150行代码 ,更容易理解也方便修改
  • 函数参数 不超过7个
  • 只做一件事情的函数更易于复用
PHP的一些重点特性

php从5.3开始,5.4,5.5,5.6一直到7都在不停的更新,这个过程中,加入了一
些其他语言比较好的语法,剔除了一些烂的语法。如下:

  • default_charset从ISO-8859-1已经变为UTF-8
  • 新增了动态访问静态方法的方式
  • 内置用于开发的 CLI 模式的 web server
  • 实例化时访问类成员 (new Foo)->bar();
  • 新增 array_column() 函数
  • 直接通过下标获取访问数组和字符串字面量的元素或字符
  • empty() 支持传入一个任意表达式,而不仅是一个变量
  • 新增 finally 关键字
  • 新增 trait 语法
  • 新增 yield 语法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值