参考链接:https://www.drupal.org/docs/develop/standards/coding-standardsIndenting and Whitespace 缩进和空格

使用2个空格,不是tabs。

行的结束不应该有空格。

所有的文本文件的在行的结尾以换行符\n结尾。

PHP文件开头的所有块应该使用空行分割。这包括/**@file*/块,命名空间声明和use语句以及文件中的后续代码。

So,for example,a file header might look as follows:

<?php


namespaceThis\Is\The\Namespace;


useDrupal\foo\bar;


/**

*Providesexample.

*/

classExampleClassName{}

.module文件

<?php


/**

*@file

*Providesexamplefunctionality

*/


useDrupal\foo\Bar;


/**

*Implementshook_help().

*/

functionexample_help($route_name){Operators 运算符

为了便于阅读,所有的二元运算符(两个值之间的运算)例如 + ,-,=,!=,==,>等应该在运算符前后有个空格。

$foo=$bar;

//not

$foo=$bar;

一元运算符(仅操作一个值得运算符)(例如++,--)在运算符与其操作的变量或数字之间不应有空格。

检查弱类型不等式必须使用!=运算符,<> 不能使用与PHP中。

Control Structures 控制结构

控制结构包括:if, for, while, switch等。

Here is a sample if statement,since it is the most complicated of them:

if(condition1||condition2){

action1;

}

elseif(condition3&&condition4){

action2;

}

else{

defaultaction;

}

Note:Don't use "else if" -- awalys use elseif.

控制语句应该在控制关键字和左括号之间有个空格,以便将它们与函数调用区分开来。即使在技术上可选的情况下也要使用花括号。

For switch statements:

switch(condition){

case1:

action;

break;


case2:

action;

break;


default:

defaultaction;

}

For d-while statements:

do{

actions;

}while($condition);模板控制语句 .tpl.php

<?phpif(!empty($item)):?>

<p><?phpprint$item;?></p>

<?phpendif;?>


<?phpforeach($itemsas$item):?>

<p><?phpprint$item;?></p>

<?phpendforeach;?>Line length and wrapping

以下规则适用于代码。 有关注释的规则,请参阅Doxygen和注释格式约定

通常,所有代码不应超过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')){

//...

}

if(preg_match('@(/|\\)(\.\.|~)@',$target)&&strpos($target_dir,

$repository)!==0){

returnFALSE;

}

不应该将条件包装成多行。

控制结构条件也不应该试图赢得“最少线条代码奖”中的最紧凑条件:

//DON'TDOTHIS!

if((isset($key)&& !empty($user->uid)&&$key==$user->uid)||

(isset($user->cache)?$user->cache:'')==ip_address()||isset($value)

&&$value>=$time())){

//...

}


//Keyisonlyvalidifitmatchesthecurrentusr'sID,asotherwise

other

//userscouldaccessanyuser'sthings.

$is_valid_user=(isset($key)&&!empty($user->uid)&&$key==$use->uid);

$is_valid_cache=(isset($user->cache)?$user->cache==ip_address():

FALSE);

$is_valid_query=$is_valid_cache||(isset($value)&&$value>=time());


if($is_valid_user||$is_valid_query){

//...

}Function Calls 函数调用

函数应该在函数名称,左括号和第一个参数之间没有空格,逗号和每个参数之间有空格,最后一个参数,右括号和分号之间没有空格。

$var=foo($bar,$baz,$quux);

Function Delarations 函数声明

带有默认值的参数出现在参数列表的末尾。如果合适,要返回有意义的值。

匿名函数应该在函数和它的参数之间有个空格,如下所示例:

array_map(function($item)use(id){

return$item[$id];

},$itmes)Calss Constructor Calls

当调用的函数没有类构造函数时,也要包含括号:

$foo=newMyClassName();

//这也是为了与有参数的构造函数保持一致

$foo2=newMyClassName($arg1,$arg2);

请注意,如果类名是一个变量,那么首先计算变量以获取类名,然后再调用:

$bar='MyClassName';

$foo=new$bar();

$foo2=new$bar($arg1,$arg2);Arrays

数组应该使用短阵列语法进行格式化,每个元素之间使用一个空格(逗号之后),关联数组使用=>运算符,前后使用空格:

$some_array=['hello','world','foo'=>'bar'];

注意,如果声明数组的行超过80个字符,则应该每个元素分成自己的行,并缩进一级:

$form['title']=[

'#type'=>'textfield',

'#title'=>t('title'),

'#size'=>60

'#maxlength'=>128,

'#description'=>t('Thetitleofyournode.'),

]

注意,最后一个元素末尾的逗号,如果其他元素稍后放置末尾,有助于防止错误解析。

请注意,PHP5.4之前的版本不支持短矩阵语法。这意味着Drupal7和Drupal7核心的语法的项目没有明确要求使用。

Quotes 引号

Drupal没有强制使用单引号与双引号的硬性标准。在可能的情况下,保持代码的一致性,尊重其他开发人员的风格。

默认情况下使用单引号,除下面情况:

1.刻意的在线变量插值,"<h3>$header</h3>";

2.包含单引号的字符串,如翻译等,"He's a good person.";

String Concatenations

始终在圆点(.)和连接部分使用空格提高可读性。

<?php


$string='Foo'.$bar;

$string=bar().'foo';

$string='Foo'.'bar';

在连接简单变量时,可以使用双引号并在其添加变量;否则,使用单引号。

<?php


$string="Foo$bar";

在使用连接赋值运算符(.=)时,与赋值运算符一样,在每一边使用空格。

<?php

$string.='Foo';

$string.=$bar;

$string.=baz();Including Code

在无条件的包含一个类文件的地方,使用require_once().在有条件的包含类文件的任何地方(工厂方法),请使用include_once().两个都确保只包含一次类文件。它们共享文件列表。

注意:include_once()和require_once是语句,而不是函数。您不需要使用括号包含文件名。

当包含同一目录或子目录的代码时,用 . 开始文件路径。

include_once ./includes/mymodule/mymodule_formatting.inc

在drupal7或更高的版本中使用DRUPAL_ROOT:

require_once DRUPAL_ROOT . '/' .varable_get('cache_inc','includes/cache.inc');

To include code in a module:

module_load_include('inc','node','node.admin');PHP Code Tags

总是使用<?php ?>来分割PHP代码,而不是简写<? ?>.

从drupal4.7开始,代码文件末尾的?>被省略。这包括模块和包文件。

1.删除它可以消除文件末尾不必要的空白,可能导致“文件头已发送”错误,XHML/XML验证问题和其他问题。

2.文件末尾的结束分割符是可选的

3.PHP.net本省从文件末尾删除结束分割符

Semicolons 分号

PHP语言在大多数行末尾都需要分号,但是在代码块的末尾可以省略它们。Drupal编码标准要求有分号,即使在代码块的末尾。

<?phpprint$tax;?>--yes

<?phpprint$tas?>--noName Conventions 命名约定

Function and variables

函数应该使用小写字母命名,单词要使用下划线分割。此外函数名还应该使用模块名/分组名做为前缀,以免冲突。

变量应该使用小写字母命名,单词使用大写字母,例如: $lowerCamelCase 或下划线 $snake_case.但要始终如一,不要混合使用。

Persistent Variables

持久变量(使用Drupal的variable_get() / variable_set()函数定义/设置)应该使用小写字母命名,使用下划线分割。它们应该使用模块/分组名称作为前缀,以免模块之间冲突。

Constants

1.常量总是使用大写,用下划线分割。

2.模块定义的常量名称还应该以它们的模块的大写拼写最为前缀。

3.在Drupal 8或更高的版本中,常量应该使用const PHP关键字(不是define())来定义,性能更好。

注意:const不适合PHP表达式。定义一个常量或非文字值时应该使用define():

<?php

constCACHE_TEMPORARY=-1;


if(!defined('MAINTENANCE_MODE')){

define('MAINTENANCE','error');

}

Global Variable

如果需要定义全局变量,则其名字应该以单个下划线开头,后面紧跟模块/主题名和另一个下划线

File Name

所有的文档文件具有文件扩展名.txt,以便于在Windows系统上查看,此外这些文件的文件名应该大写(README.txt而不是readme.txt)示例:README.txt,INSRALL.txt,TODO.txt等。

Helper Modules

有几个贡献的模块可以协助审查代码标准的遵从性:

1. Coder

2. Dreditor

3. PAReview

4.Coder Sniffer