PHP编码规范的深入探讨_php技巧

缩进与空白字符(Indenting and Whitespace)
使用 2 个空格而不使用 tab 键进行代码缩进(notepad++, Eclipse 等编辑器均支持此项配置);
行尾不应该有空白字符
应使用 \n (Unix换行符),而不是 \r\n (Windows 换行符)
所有文件均应以一个空行结尾

运算符(Operators)
所有二元运算符(二个值之间的运算符),如 +, -, =, !=, ==, > 等等,在运算符两端均需留有一个空格,如应该使用 $foo = $bar 而不是 $foo=$bar。
所有一元运算符(只操作一个值班的运算符),例如 ++,在值与运算符之间则不应加入空格

转型(Casting)
在 (type) 与要转型的变量之间应加入一个空格,如 (int) $mynumber.
控制结构(Control Structures)
控制结构包含 if, for, while, switch 等等,下面是一个简单的 if 语句结构示例:

复制代码 代码如下:

if (condition1 || condition2) {
  action1;
}
elseif (condition3 && condition4) {
  action2;
}
else {
  defaultaction;
}

(Note: 不要使用 "else if" -- 总是使用 elseif.)
控制语句的关键词与左边括号之间应该有一个空格,以此来与函数调用进行区分。
即使在大括号是可选的情况下,也应当总是使用大括号。这样可以加强代码的可读性以及减少因嵌套带来的逻辑错误。
switch 语句结构示例:

复制代码 代码如下:

switch (condition) {
  case 1:
    action1;
    break;
  case 2:
    action2;
    break;
  default:
    defaultaction;
}
do-while 语句结构示例:
do {
  actions;
} while ($condition);

行长度与封装(Line length and wrapping)
通常情况下,每行代码的长度不应超过80个字符
以下情况,行长度可超过80个字符:当行内包含过长的函数名称、函数/类定义、变量声明等
为方便阅读和理解,控制结构的行长度可超过80个字符

复制代码 代码如下:

  if ($something['with']['something']['else']['in']['here'] ==
mymodule_check_something($whatever['else'])) {
    ...
  }
  if (isset($something['what']['ever']) && $something['what']['ever'] > $infinite
&& user_access('galaxy')) {
    ...
  }
  // Non-obvious conditions of low complexity are also acceptable, but should
  // always be documented, explaining WHY a particular check is done.
  if (preg_match('@(/|\\)(\.\.|~)@', $target) && strpos($target_dir, $repository)
!== 0) {
    return FALSE;
  }

控制条件(condition)不应该写作多行
控制条件应该适当拆分以便于阅读和理解,编写代码时要避免以下情形:

复制代码 代码如下:

// DON'T DO THIS!
if ((isset($key) && !empty($user->uid) && $key == $user->uid) || (isset($user-
>cache) ? $user->cache : '') == ip_address() || isset($value) && $value >= time()))
{
  ...
}

将控制条件进行拆分,不仅便于阅读,同时也方便添加注释让人知道为何进行这样的条件判断

复制代码 代码如下:

// Key is only valid if it matches the current user's ID, as otherwise other
// users could access any user's things.
$is_valid_user = (isset($key) && !empty($user->uid) && $key == $user->uid);
// IP must match the cache to prevent session spoofing.
$is_valid_cache = (isset($user->cache) ? $user->cache == ip_address() : FALSE);
// Alternatively, if the request query parameter is in the future, then it
// is always valid, because the galaxy will implode and collapse anyway.
$is_valid_query = $is_valid_cache || (isset($value) && $value >= time());
if ($is_valid_user || $is_valid_query) {
  ...
}

函数调用(Function Calls)
调用函数时,函数名与左括号之间没有空格,除最后一个参数外,每个参数后的 , 都应跟上一个空格,如:
$var = foo($bar, $baz, $quux);
如之前所说,等号两边应该各有一个空格。当有一系列相关语句时,出于可读性的考虑,可以适当增加空格的数量,如:
$short         = foo($bar);
$long_variable = foo($baz);

函数声明(Function Declarations)
包含默认值的参数应当放在最后,当函数拥有返回值时,尽量返回便于理解的值:

复制代码 代码如下:

function funstuff_system($field) {
  $system["description"] = t("This module inserts funny text into posts randomly.");
  return $system[$field];
}

类构造器调用(Class Constructor Calls)
当调用不带参数的类构造器时,始终包含括号
$foo = new MyClassName();

带参数的类构造器
$foo = new MyClassName($arg1, $arg2);
如果使用变量做为类名,需先为变量赋值,然后才调用类构造器:

复制代码 代码如下:

$bar = 'MyClassName';
$foo = new $bar();
$foo = new $bar($arg1, $arg2);

数组(Array)
数组的值之间应使用空格分隔,赋值操作符号(=>)左右也应包含空格:
$some_array = array('hello', 'world', 'foo' => 'bar');
当声明数组的字符长度超过80个字符(通常在构造表单和菜单时),应该将各元素分行、缩进编写:

复制代码 代码如下:

$form['title'] = array(
  '#type' => 'textfield',
  '#title' => t('Title'),
  '#size' => 60,
  '#maxlength' => 128,
  '#description' => t('The title of your node.'),
);

注意:最后一个数组元素末尾有一个逗号,这并不是手误,而是避免有新元素加入到最后之后因缺少逗号而出现解析错误。(从某种程度上来讲,在最后一个数组元素末尾加上逗号是一种推荐的做法,甚至在向drupal.org提交代码时,一些代码规范检测脚本会因为最后一个元素没有添加逗号而出现警告提示。)

引号(Quotes)
Drupal 对于单引号和双引号的使用并没有很强硬的标准,只需在同一模块内保持用法的统一即可。
使用单引号的效率要高于双引号,因为解析器不需要到引号之间查找变量。以下是使用双引号的两种情况:
引号中间带有变量,如"<h2>$header</h2>"
引号中间带有单引号,使用双引号可避免对单引号的转义 "He's a good person." 当然也可以使用单引号,但 .pot 解析器不能很好的处理这种情况,而且看起来怪怪的'He\'s a good person.'

字符串连接(String Concatenations)
在点与要连接字符串之间需要加入空格以加强代码可读性:
如果只是简单地连接变量,可以使用双引号
使用连接赋值符(.=)时,需要在符号两侧预留空格

注释(Comment)
注释规范单独在 Doxygen及注释格式规范页面 讨论

引入代码(Including Code)
任何无条件引用文件的情况下,使用 require_once(), 任何有条件引用文件的情况,则使用 include_once(). 这两条语句都会保证文件只被引入一次。
当从当前目录或子目录引入代码时,始终以点路径开头
include_once ./includes/mymodule_formatting.inc
在 Drupal 7 及更新版本中,使用 DRUPAL_ROOT 常量:
require_once DRUPAL_ROOT . '/' . variable_get('cache_inc', 'includes/cache.inc');
PHP 代码标签(PHP Code Tags)
始终使用<?php ?>来界定PHP代码而不使用要<? ?>。这是为了遵循Drupal规范,同时也便于代码在其它系统和平台中被引用。
自 Drupal 4.7 开始,最后的 ?> 都故意被忽略不写,原因如下:
移除它可以避免在文件末尾出现空白字符,这些空白字符可能导致“文件头已发送(header already sent)”错误,XHTML/XML验证错误,及其它问题
PHP 官方说明 结尾的PHP界定符是可选项
PHP.net 自身也移除了文件末尾的界定符(如 prepend.inc )

分号(Semicolons)
PHP 语言要求除了代码块以外,大多数行尾都要跟上分号。Drupal 代码规范同样有此要求,并且对于代码块也是如此。以下是一个单行代码块的示例:
 -- YES
 -- NO
示例 URL(Example URL)
使用 example.com 表示所有示例 URLs
命名规范(Naming Conventions)
函数与变量(Functions and Variables)
函数与变量名称应该使用小写字母,且单词之间使用下划线分隔。函数应该使用模块组/模块名称作为前缀,以避免与不同模块间的冲突。
持久变量(Persistent Variables)
持久变量是指通过 variable_get()/variable_set() 函数取得和设置的变量,变量名称应该使用小写字母,且单词之间使用下划线进行分隔。持久变量也应该使用模块组/模块名称作为前缀,以避免与不同模块间的冲突。

常量(Constants)
常量始终要求使用全大写字母,且单词之间使用下划线进行分隔。(包括PHP内置常量 TRUE, FALSE, NULL)
模块中定义的常量需始终使用大写的模块名称作为前缀。
在 Drupal 8 及之后,应使用 const 关键词代替 define() 函数来定义常量,因为效率更高
注意 const 不能用于PHP表达式,因此在条件判断和非字面值(non-literal value ???)时,还是应当使用 define() 函数

全局变量(Global Variables)
定义全局变量时,应当使用下划线加模块/主题名称开头
类(Class)
类名应使用驼峰式命名(即单词首字母大写)

类中的方法(函数)和属性(成员变量)应使用首字母小写的驼峰式

定义访问权限时,使用 protected 而代替 private,从而其它的类可以在必要时扩展和更新方法。Protected 和 public 函数和变量不应以下划线开头。
更多关于 面向对象的编码规范
文件名(Filename)
所有文档文件都应加上 .txt 后缀,以便于 Windows 用户查看。同时,所有文件名称应该全部大写,而文件后缀应该全部小写。
如 README.txt, INSTALL.txt, TODO.txt, CHANGELOG.txt 等等。

辅助模块及工具
Coder 模块:可以遵循部分以上代码规范,对代码进行审查及修改建议
Drupal Code Sniffer :代码规范检测工具
PAReview.sh :还处理沙盒中的代码规范检测脚本,几乎严格遵守以上所有代码规范并给出修改建议。

时间: 2024-09-15 04:05:20

PHP编码规范的深入探讨_php技巧的相关文章

PHP符合PSR编程规范的实例分享_php技巧

前言 关于开发标准这块,可以说一直都是风格迥异,各家都有各家的玩法,民间更是个人玩个人的.目前我们国内比较出名的几个框架(Yii,Laravel) 都已经支持Composer并且加入了PHP-FIG(php框架程序组). 其中Composer的自动加载就支持PHP-FIG指定的PSR-0 和 PSR-4 规范来实现自动加载机制,并且Composer推荐使用PSR-4 PHP-FIG 这是一个自愿非正式的机构,但是就目前对我们的影响来看,可能都已经默认为一个公信组织了,的的确确制定了不少非常好的规

深入php 正则表达式的学习探讨_php技巧

1.入门简介 简单的说,正则表达式是一种可以用于模式匹配和替换的强有力的工具.我们可以在几乎所有的基于UNIX系统的工具中找到正则表达式的身影,例如,vi编辑器,Perl或PHP脚本语言,以及awk或sed shell程序等.此外,象JavaScript这种客户端的脚本语言也提供了对正则表达式的支持.由此可见,正则表达式已经超出了某种语言或某个系统的局限,成为人们广为接受的概念和功能. 正则表达式可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件.程序输入以及WEB页面的表

PHP与MYSQL中UTF8编码的中文排序实例_php技巧

本文实例讲述了PHP与MYSQL中UTF8编码的中文排序方法,分享给大家供大家参考.具体实现方法如下: 一般来说,中文共有三种排序方式: 1.根据拼音排序: 2.根据笔画排序: 3.根据偏旁排序. 系统的默认排序方式为拼音排序了,这个也是我们常用的,下面介绍的就是按拼音排序了 1. 需要在php数组中用中文排序,但是一般使用utf8格式的文件,直接用asort排序不行.用gbk和gb2312可以.这跟几种格式的编码有关系.gbk和gb2312本身的编码就是用拼音排序的. 复制代码 代码如下: f

使用Curl进行抓取远程内容时url中文编码问题示例探讨_php技巧

PHP中对于URL进行编码,可以使用 urlencode() 或者 rawurlencode(),二者的区别是前者把空格编码为 '+',而后者把空格编码为 '%20',不过应该注意的是,在编码时应该只对部分URL编码,否则URL中的冒号和反斜杠也会被转义.下面是详细解释: 复制代码 代码如下: string urlencode( string str) 返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+). 例子 1 :u

php中的字符编码转换函数用法示例_php技巧

本文实例讲述了php中的字符编码转换函数的用法,分享给大家供大家参考.具体实现方法如下: 一般来说,在网页程序中,尤其是涉及到数据库的读出过程中,往往最恼火的就是字符编码的问题,php4.0.6以上的版本提供了mb_convert_encoding 可以方便的转换编码. 具体如下: 复制代码 代码如下: <?php /* Convert internal character encoding to SJIS */ $str = mb_convert_encoding($str, "SJIS

PHP学习散记_编码(json_encode 中文不显示)_php技巧

在网上找到一种解决方法: 复制代码 代码如下: <?php /* 处理json_encode中文乱码 */ $data = array ('game' => '冰火国度', 'name' => '刺之灵', 'country' => '冰霜国', 'level' => 45 ); echo json_encode ( $data ); echo "<br>"; $newData = array (); foreach ( $data as $k

PHP学习笔记之字符串编码的转换和判断_php技巧

复制代码 代码如下: iconv('GBK', 'UTF-8//IGNORE', ''); // 将字符串由 GBK 编码转换为 UTF-8 编码 但 iconv 只能解决编码预先知道的情况,如果字符串编码未知,则需要先探测其编码,这时可能会用到 mb_string 扩展库: 复制代码 代码如下: mb_detect_encoding(''); 可是 mb_detect_encoding 存在一个硬伤,经常出现判断不准确的情况.或许这样就可以解决: 复制代码 代码如下: // 使用 iconv

基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)_php技巧

1.使用curl实现站外采集 具体请参考我上一篇笔记:http://www.jb51.net/article/46432.htm 2.编码转换首先通过查看源代码找到采集的网站使用的编码,通过mb_convert_encoding函数进行转码: 具体使用方法: 复制代码 代码如下: //源字符是$str //以下已知原编码为GBK,转换为utf-8 mb_convert_encoding($str, "UTF-8", "GBK"); //以下未知原编码,通过auto自

关于PHP的curl开启问题探讨_php技巧

今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢?能做什么? 简单介绍,当我们需要抓去某个网站的数据信息时,可以用到file(),file_get_contents()等网页读取函数,因为 过多的小偷程序泛滥,导致一些站点做了域名限制,从而是的这些file()函数效率低下甚至失效. 如果使用curl来优化一下的话就能进行一些表单,cookie,验