WordPress编码标准

0条评论

在WordPress中,一些PHP旧代码结构并不一致。WordPress正在通过促使开发人员使用统一的风格结构来逐步改进代码,以使其更为简洁,让人能一目了然。

在为WordPress编写代码时(无论是编写核心代码,还是编写插件或主题代码),请遵循以下规范。虽然其大部分规范和Pear 标准类似,但一些关键部分还是有所差异的。

查看 wp-hackers邮件列表上关于编码风格的文章。

单引号和双引号
在适当的位置使用单引号和双引号。如果不在字符串中赋值,请使用单引号。在字符串中几乎无需给HTML引号转义,因为你可以直接转换引号风格,如:
echo "<a href='$link' title='$linktitle'>$linkname</a>";  echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';
但JavaScript例外,它有时要求必须使用双引号或单引号。属性文本需要使用attribute_escape()进行转义,这样的话,单引号或双引号就不会终止属性值,使XHTML无效,进而产生安全问题。
缩进
缩进应当反映逻辑结构。要使用真正的制表符,而不是空格,因为制表符在不同的客户端之间能够提供最大的灵活性。
例外:如果对齐代码会使其更易阅读,可使用制表符来实现首行缩进,然后用空格来填补其余空白。
[tab]$foo   = 'somevalue';  [tab]$foo2  = 'somevalue2';  [tab]$foo34 = 'somevalue3';  [tab]$foo5  = 'somevalue4';  
请留意如何通过制表符来完成首行缩进,而空格只是用来确保等号排列整齐
大括号
多行代码块应该使用大括号:
if ( condition ) {      action1();      action2();  } elseif ( condition2 && condition3 ) {      action3();      action4();  } else {     defaultaction();  }  
如果代码块比较长,就要考虑是否可以把它分隔成两个或更多的代码块或函数。如果无法分隔,请在末尾添加小段注释以让他人一眼就能看出大括号结尾内容(通常适用于超过35行的逻辑代码块,但是所有不能直观看出功能的代码都可以添加注释)。
单行的代码可以不使用大括号,这样也更简洁,如:
if ( condition )      action1();  elseif ( condition2 )      action2();  else      action3();  
include_once 与require_once 
正如php手册所述:“这两个结构的其它功能都完全相同,除了处理失败的方法有所不同。 include()会生成一个Warning(警告),而require()会产生Fatal Error(致命错误)。”致命错误会终止脚本运行。
正则表达式
与POSIX(以unix操作系统为基础的可携带操作系统界面)正则表达式相比,应优先使用Perl兼容正则表达式(PCRE, preg_ functions)。
不要使用简略的PHP
禁止使用简略的PHP开始标签(<? ... ?> or <?=$var?>),而应使用完整的PHP标签(<?php ... ?>)。另外,务必要删除PHP标签结尾处的空格。
空格使用
在逗号之后,逻辑及赋值操作符(如,"x == 23", "foo && bar", "array( 1, 2, 3 )")的两侧, if, elseif, foreach, for 和 switch代码块(switch blocks)的打开和关闭括号(如,foreach ( $foo as $bar ) { ...)的两侧都要使用空格。定义函数时,应当按照以下操作: function myfunction( $param1 = 'foo', $param2 = 'bar' ) { 调用函数时,使用:myfunction( $param1, funcparam( $param2 ) );
格式化SQL语句
格式化SQL语句时,如果语句较为复杂,就可以把它分成多行并缩进。但多数语句无需分割成多行就能很好的运行。另外,要大写SQL语句中诸如UPDATE 或WHERE这样的词语。
更新数据库的函数参数通过时无需使用SQL斜线转义。转义应当尽量和查询同时进行,而且最好使用$wpdb->prepare()。
$wpdb->prepare()是用来处理SQL查询转义,引用和整型转换(int-casting)的一种方法,它使用了sprintf()子集格式。如:
$var = "dangerous'"; // raw data that may or may not need to be escaped  $id  = some_foo_number(); // data we expect to be an integer, but we're not certain    $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );  
%s用来表示字符串占位符,%d 用来表示整数占位符。注意它们并没有使用引号。$wpdb->prepare()会处理转义和引号,这样就无需手动使用 $wpdb->escape()转义了,而且很容易就能看出某个字符是否转义,因为查询执行和字符转义是同时进行的。
数据库查询
要避免直接接触数据库。如果能用函数提取数据库信息就最好了。数据库抽象层(使用函数,而非查询语句)能使代码实现前向兼容,而且如果结果缓存在内存中,还会节约大量时间。如果不得不访问数据库,可在wp-hackers 邮件列表发布消息以与开发人员取得联系。这样,他们或许就会在下个版本创建可完成你所需的某个功能的函数。
变量,函数和操作符
请不要创建只会使用一次的变量或查询语句。操作数据库时,尽量使用函数的wpdb类
此外,也可使用三元操作符(Ternary operators) ,但使用前要测试语句是否为真,否则,代码会出现混乱。
// GOOD example:  // (if statement is true) ? (do this) : (if false, do this);  $musictype = ( 'jazz' == $music ) ? 'cool' : 'blah';    
以上示例需要注意的另外一点是,当作逻辑比较时,要把变量放在右侧。如果忘记使用等号,系统就会出现分析错误,而不会判断真假来执行语句了。测试并不需要占用额外时间,而且如果能够避免一个bug,还是值得的。