使用2个空格,不是tabs。
行的结束不应该有空格。
所有的文本文件的在行的结尾以换行符\n结尾。
PHP文件开头的所有块应该使用空行分割。这包括/**@file*/块,命名空间声明和use语句以及文件中的后续代码。
So,for example,a file header might look as follows:
<?php
namespace This\Is\The\Namespace;
use Drupal\foo\bar;
/**
* Provides example.
*/
class ExampleClassName {}
.module文件
<?php
/**
* @file
* Provides example functionality
*/
use Drupal\foo\Bar;
/**
* Implements hook_help().
*/
function example_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) {
case 1:
action;
break;
case 2:
action;
break;
default:
defaultaction;
}
For d-while statements:
do {
actions;
} while ($condition);
模板控制语句 .tpl.php
<?php if (!empty($item)) : ?>
<p><?php print $item; ?></p>
<?php endif; ?>
<?php foreach ($items as $item): ?>
<p><?php print $item; ?></p>
<?php endforeach; ?>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) {
return FALSE;
}
不应该将条件包装成多行。
控制结构条件也不应该试图赢得“最少线条代码奖”中的最紧凑条件:
// 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 usr's ID, as otherwise
other
// users could access any user's things.
$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 = new MyClassName();
// 这也是为了与有参数的构造函数保持一致
$foo2 = new MyClassName($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('The title of your node.'),
]
注意,最后一个元素末尾的逗号,如果其他元素稍后放置末尾,有助于防止错误解析。
请注意,PHP5.4之前的版本不支持短矩阵语法。这意味着Drupal7和Drupal7核心的语法的项目没有明确要求使用。
Quotes 引号Drupal没有强制使用单引号与双引号的硬性标准。在可能的情况下,保持代码的一致性,尊重其他开发人员的风格。
默认情况下使用单引号,除下面情况:
1.刻意的在线变量插值,"<h2>$header</h2>";
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编码标准要求有分号,即使在代码块的末尾。
<?php print $tax; ?> -- yes
<?php print $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
const CACHE_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