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 :还处理沙盒中的代码规范检测脚本,几乎严格遵守以上所有代码规范并给出修改建议。

(0)

相关推荐

  • PHP的PSR规范中文版

    文档仓库地址:https://github.com/hfcorriez/fig-standards PSR规范中文版 PSR-0自动加载 PSR-1基本代码规范 PSR-2代码样式 PSR-3日志接口为何规范 摘录翻译了官方的一句话 本组织旨在通过讨论我们代码项目的共同点以找出一个协作编程的方法. 在此想到了一篇文章<Google为何要执行严格的代码规范>中有这么一段话: 复制代码 代码如下: 在谷歌,我可以查看任何的代码,进入所有谷歌的代码库,我有权查看它们.事实上,这种权限是很少人能拥有的

  • PHP符合PSR编程规范的实例分享

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

  • 培养自己的php编码规范

    为什么我们要培养自己的编码规范? 我们写代码的时候,一个好的编码规范,对我们来说能够起到很多意向不到的效果.至少会有一下的好处: 1.提高我们的编码效率.整齐划一的代码方便我们进行复制粘贴嘛! 2.提高代码的可读性. 3.显示我们专业.别人看到了我们的代码,发现整个代码的书写流程都整齐划一,瞬间逼格就上去了! 4.方便团队协同工作.大家使用同一的规范,这样就消除了五花八分的书写方式,同一协调! 编码规范包含两大块,代码规范和注释规范 其实我们所写的php脚本,其实也就是由两大块组成的,即对代码的

  • php 注释规范

    @access 使用范围:class,function,var,define,module 该标记用于指明关键字的存取权限:private.public或proteced @author 指明作者 @copyright 使用范围:class,function,var,define,module,use 指明版权信息 @deprecated 使用范围:class,function,var,define,module,constent,global,include 指明不用或者废弃的关键字 @exa

  • PHP编码规范之注释和文件结构说明

    文件结构 |――images |――include |――parameter |――config |――function |――index images存放图片文件,include中是系统是要引用的文件,一般在parameter中存放参数文件,config中存放配置文件,function中存放方法文件,如javascript的方法等,并按功能模块的分类,将各功能的类也放入其中 文件名 文件夹命名一般采用英文,长度一般不超过20个字符,命名采用小写字母.除特殊情况才使用中文拼音,一些常见的文件夹命

  • PHP Document 代码注释规范

    1. 什么是phpDocumentor ? PHPDocumentor 是一个用PHP写的工具,对于有规范注释的php程序,它能够快速生成具有相互参照,索引等功能的API文档.老的版本是 phpdoc,从1.3.0开始,更名为phpDocumentor,新的版本加上了对php5语法的支持,同时,可以通过在客户端浏览器上操作生成文档,文档可以转换为PDF,HTML,CHM几种形式,非常的方便. PHPDocumentor工作时,会扫描指定目录下面的php源代码,扫描其中的关键字,截取需要分析的注释

  • PHP文件注释标记及规范小结

    PHP 注释标记 @access 使用范围:class,function,var,define,module 该标记用于指明关键字的存取权限:private.public或proteced @author 指明作者 @copyright 使用范围:class,function,var,define,module,use 指明版权信息 @deprecated 使用范围:class,function,var,define,module,constent,global,include 指明不用或者废弃

  • PHP编码规范-php coding standard

    目录 介绍 标准化的重要性 解释 认同观点 项目的四个阶段 命名规则 合适的命名 缩写词不要全部使用大写字母 类命名 类库命名 方法命名 类属性命名 方法中参数命名 变量命名 引用变量和函数返回引用 全局变量 定义命名 / 全局常量 静态变量 函数命名 php文件扩展名 文档规则 评价注释 Comments Should Tell a Story Document Decisions 使用标头说明 Make Gotchas Explicit Interface and Implementatio

  • 讲的非常不错的PHP编码规范第1/3页

    注:这是从PHPCMS开发文档里看到编码规范,虽名为PHPCMS的开发规范,但我觉得所有的PHP编程都该如此.写了那么多PHP,很多编码对照这规范都感觉欠缺很多,今后一定要对照纠正. Phpcms 编码规范 1. 引言-. 2 2. 适用范围-. 2 3. 标准化的重要性和好处-. 3 4. PHP编码规范与原则-. 3 4.1. 代码标记- 3 4.2. 注释- 3 4.3. 书写规则- 4 4.3.1. 缩进- 4 4.3.2. 大括号{}.if和switch. 4 4.3.3. 运算符.小

  • PHP编码规范的深入探讨

    缩进与空白字符(Indenting and Whitespace)使用 2 个空格而不使用 tab 键进行代码缩进(notepad++, Eclipse 等编辑器均支持此项配置);行尾不应该有空白字符应使用 \n (Unix换行符),而不是 \r\n (Windows 换行符)所有文件均应以一个空行结尾 运算符(Operators)所有二元运算符(二个值之间的运算符),如 +, -, =, !=, ==, > 等等,在运算符两端均需留有一个空格,如应该使用 $foo = $bar 而不是 $fo

  • 浅谈JavaScript编程语言的编码规范

    JavaScript 编程语言作为最流行的客户端脚本语言,早已被众多 Web 开发人员所熟悉.随着 Web2.0 时代的到来和 Ajax 技术的广泛应用,JavaScript 也逐渐吸引着更多的视线.工作中要求越多的是对 JavaScript 语言的深入学习,灵活运用,和对编码质量的保证. 对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编码规范也

  • 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 2.命名规范 注:个人经验,经供参考 一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Button android:id="@+id/editinfo_b

  • Python 常用 PEP8 编码规范详解

    Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格. 括号中使用垂直隐式缩进或使用悬挂缩进. EXAMPLE: # (垂直隐式缩进)对准左括号 foo = long_function_name(var_one, var_two, var_three, var_four) # (悬挂缩进) 一般情况只需多一层缩进 foo = long_function_name( var_one, var_two, var_three, var_four) # (悬挂缩进) 但下面情况,

  • 5 种JavaScript编码规范

    什么是编码规范 编码规范就是指导如何编写和组织代码的一系列标准.通过阅读这些编码规范,你可以知道在各个公司里代码是如何编写的. 我们为什么需要编码规范 一个主要的原因是:每个人写代码的方式都是不同的.我可能喜欢这么写,而你喜欢用另一种方法写.如果我们只处理自己的代码,这样并没有什么问题.但如果有成千上万的程序员同时在一个代码库上面工作呢?如果没有规范,事情很快会变得一团糟.代码规范可以让新人迅速的熟悉相关的代码,并且也能写出让其他程序员简单易懂的代码. Airbnb JavaScript Sty

  • Javascript 编码约定(编码规范)

    1.使用 strict 模式 在一个作用域(包括函数作用域.全局作用域)中,可以使用 "use strict"; 来开启 strict 模式. 2.缩进 用 Tab 键进行代码缩进,以节约代码大小,使用4个空格的宽度来进行缩进(JSLint 建议). 3.符号 1) 大括号 与语句放同一行,放于最后面:仅有一行语句,也使用大括号: if (true) { //true } else { //false } while (true) { //alert(1); } 2) 空格 在逗号.分

  • Python 编码规范(Google Python Style Guide)

    Python 风格规范(Google) 本项目并非 Google 官方项目, 而是由国内程序员凭热情创建和维护. 如果你关注的是 Google 官方英文版, 请移步 Google Style Guide 以下代码中 Yes 表示推荐,No 表示不推荐. 分号 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 每行不超过80个字符 以下情况除外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这

  • python 编码规范整理

    一 代码编排 1 缩进4个空格的缩进(编辑器都可以完成此功能),不要使用Tap,更不能混合使用Tap和空格. 2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在操作符的后边敲回车. 3 类和top-level函数定义之间空两行:类中的方法定义之间空一行:函数内逻辑无关段落之间空一行:其他地方尽量不要再空行. 二 文档编排 1 模块内容的顺序:模块说明和docstring-import-globals&constants-其他定义.其中import部分,又按标准.三方和自己编写顺

随机推荐