PHP 编码习惯

Jackey PHP 2,825 次浏览 没有评论

PHP的命名

不好的命名

  1. function func1($var){
  2. $a = strrpos($var, '.');
  3. $b = substr($var, $a+1);
  4. return $b;
  5. }

 

好的命名

  1. function extName($fileName){
  2. $dotPos = strrpos($fileName, '.');
  3. $extName = substr($fileName, $dotPos + 1 );
  4. return $extName;
  5. }

 

命名的注意事项:

  • 命名要有实际含义
  • 命名风格保持一致
  • 不用拼音命名
  • 不用语言关键字

适当的使用注释

终极要求:代码就是注释

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

多备份重要的代码

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

坚持字符编码统一

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

使用之前,变量要初始化

  1. function getInfo($arrId){
  2. $ids = implode(',', $arrId);
  3. $query = mysql_query("select * from test where id in ($ids)");
  4. while($info = mysql_fetch_array($query)){
  5. $info['name'] = trim($info['name']);
  6. $info['addr'] = trim($info['addr']);
  7. $list[] = $info;
  8. }
  9. return $list;
  10. }

 

  1. function getInfo($arrId)
  2. {
  3. $list = array();
  4. $ids = implode(',', $arrId);
  5. $query = mysql_query("select * from test where id in ($ids)");
  6. while ($info = mysql_fetch_array($query)) {
  7. $info['name'] = trim($info['name']);
  8. $info['addr'] = trim($info['addr']);
  9. $list[] = $info;
  10. }
  11. return $list;
  12. }

 

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


可以想象, PHP引擎会首先按照正常的逻辑来获取这个变量, 然而这个变量不存在, 所以
PHP引擎需要抛出一个NOTICE, 并且进入一段使用未定义变量时应该走的逻辑, 然后返回

一个新的变量.


另外, 阅读代码的角度讲, 当你使用一个未定义的变量时, 会让阅读你代码的人困惑:”
个变量在那里初始化的
, 和之前的代码有关系么? include进来的文件有关系么?”

使用 NULL === 来代替 is_null

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

尽量使用 === 尽量不用 ==

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

避免在for循环中计算

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

 

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

  1. $j=strlen($str);
  2. for ($i=0; $i<$j; $i++) {
  3. }

 

strtr替代str_replace

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

 

strtr函数的效率是str_replace的四倍

优先使用单引号

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

header头的编码

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

php结束标记不要写

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

测试环境开启所有错误

error_reporting(7)

  • 1E_ERROR
  • 2E_WARNING
  • 4E_PARSE

但切记,上线之后要关闭我们的报错,将我们的错误代码写入到错误日志中,方便查错

屏蔽错误非常低效

养成不用 @ 的好习惯

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

FALSE表示错误, NULL表示不存在

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

优先使用PHP内置函数

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

  1. 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手册中常见的字符串函数和数组函数,也需要熟悉,优先使用

防御式编程思想

不要相信外部的一切输入! 所有的输入都要检查!

  1. $username = htmlspecialchars($_GET['username']);

使用PDO操作MySQL

  1. # 写法一
  2. $sql = "select * from chapter where id=:id";
  3. // 预处理 SQL 语句
  4. $res = $db->prepare($sql);
  5. // 执行 SQL
  6. if ($res->execute([":id" => 1])) {
  7. // 获取一行结果集
  8. $row = $res->fetch();
  9. print_r($row);
  10. } #
  11. # 写法二
  12. $sql = "select * from chapter where id=? and status=?";
  13. // 预处理 SQL 语句
  14. $res = $db->prepare($sql);
  15. // 执行一条预处理语句
  16. if ($res->execute([2, 1])) {
  17. // 获取一行结果集
  18. $row = $res->fetch();
  19. print_r($row);
  20. }

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Go