WordPress PHP 编码规范吐血整理5000字
但是,这个编码规范不仅仅涉及编码风格,还包括 WordPress 生态系统中互操作性、可翻译性和安全性的最佳实践。因此,即使使用其他编码风格,仍然建议开发人员使用仍然遵守 WordPress 编码标准的最佳实践方面。
![]()
目前,并非所有核心代码都完全符合此规范,但所有最近提交和/或更新的代码都需要完全符合。
对于开发者来说,如果你想按照这个规范自动检查你的代码,可以使用WordPress官方基于PHP_CodeSniffer开发的编码规范工具。
引号
正确使用单引号和双引号。如果字符串不包含变量,则使用单引号。切勿在字符串中传递引号,而应更改引号类型,例如:
echo '<a href="/static/link" title="Yeah yeah!">Link name</a>';echo "<a href='$link' title='$linktitle'>$linkname</a>";
HTML 或 XML 属性中的文本应进行转义,以免单引号或双引号结束属性,使 HTML 标签无效,甚至导致安全问题。我们将在以后的文章中详细解释如何转义属性。 。
缩进
首先使用制表符代替空格进行缩进,并使用空格对齐代码,以便于阅读:
[tab]$foo = 'somevalue';[tab]$foo2 = 'somevalue2';[tab]$foo34 = 'somevalue3';[tab]$foo5 = 'somevalue4';
对于关联数组,如果数据包含多个元素,则应以每个元素开始。新行:
$query = new WP_Query( array( 'ID' => 123 ) );$args = array([tab]'post_type' => 'page',[tab]'post_author' => 123,[tab]'post_status' => 'publish',);$query = new WP_Query( $args );
特别注意数组最后一个元素后面的逗号。建议添加它们,因为这样可以更轻松地调整数组的顺序并添加新元素,因为您不必关注最后一个元素是否存在。逗号。
对于switch结构,必须将case语句缩减一个选项卡,一个选项卡比❀语句必须更大,而语句则比案例条件语句要多。输入一个选项卡。
switch ( $type ) {[tab]case 'foo':[tab][tab]some_function();[tab][tab]break;[tab]case 'bar':[tab][tab]some_function();[tab][tab]break;}
经验法则:在行首使用制表符进行缩进,在行内使用空格进行对齐。
大括号
大括号的使用模式如下:
if ( condition ) {action1();action2();} elseif ( condition2 && condition3 ) {action3();action4();} else {defaultaction();}
如果代码块很长,请考虑将其分成几个较短的代码块、函数或方法,以降低复杂性,提高测试的可用性,当然也增加了代码的可读性。
无论是否需要都使用大括号:
if ( condition ) {action0();}if ( condition ) {action1();} elseif ( condition2 ) {action2a();action2b();}foreach ( $items as $item ) {process_item( $item );}
特别是,强制使用大括号意味着不允许单语句嵌入控制结构,但可以使用控制结构的替代语法(例如/) 代替 endif, while/endwhile) - 特别是使用 HTML 模板嵌入 PHP 代码时,例如: elseif 其他if
,因为t状态下的冒号代码语句使用了else if和if|elseift的冒号语法。 elseif。
数组声明
使用长数组语法 (array( 1, 2, 3 ) ) 来声明数组通常比 1, array, t.] ) 更具可读性和,对于初学者来说,更具描述性。
所以数组声明必须使用长数组语法。
闭包(匿名函数)
在某些情况下(例如回调函数只需要使用一次),可以使用闭包而不是重写新函数将其作为回调函数发送,例如。 :
$caption = preg_replace_callback('/<[a-zA-Z0-9]+(?: [^<>]+>)*/',function ( $matches ) {return preg_replace( '/[\r\n\t]+/', ' ', $matches[0] );},$caption);
但不建议对过滤器或动作回调函数使用闭包,因为通过remove_action() / ♼_filter() 删除时会变得复杂。
函数多行调用
将函数调用分成多行时,每个参数必须位于单独的行上。单行内联注释可以独占一行:
每个参数不得超过一行,如果如果一个参数需要多行,则可以将其分配给一个变量,然后传递给函数调用。
$bar = array('use_this' => true,'meta_key' => 'field_name',);$baz = sprintf(/* translators: %s: Friend's name */esc_html__( 'Hello, %s!', 'yourtextdomain' ),$friend_name);$a = foo($bar,$baz,/* translators: %s: cat */sprintf( __( 'The best pet is a %s.' ), 'cat' ));
正则表达式
正则表达式应使用 Perl 兼容的正则表达式(PCRE、preg_ 函数),并且切勿使用 ❙ 开关代替 preg_replace_callback 。
在正则表达式中使用单引号字符串是最简单的,因为与双引号字符串相比,单引号字符串只有两个必须传递的元序列:\'和 \ 。
PHP 开始和结束标记
如果要在 HTML 模板中嵌入多行 PHP 代码,PHP 开始和结束标记必须位于单独的行上。
正确(多行):
function foo() {?><div><?phpecho bar($baz,$bat);?></div><?php}
正确(单行):
<input name="<?php echo esc_attr( $name ); ?>" />错误:
if ( $a === $b ) { ?><some html><?php }不要使用缩写的 PHP 标签不要使用缩写的 PHP 版本,我从不使用缩写的版本:PHP。
正确:
<?php ... ?><?php echo $var; ?>
错误:
<? ... ?><?= $var ?>
删除行尾空格
删除每行末尾空格,随意删除PHP退出代码,如果没有,则将文件放在最后确保删除 PHP- 空格后面的退出代码。
使用空格
始终在逗号后面以及逻辑运算符、比较运算符、字符串连接运算符和赋值运算符的两侧放置空格。
x === 23foo && bar! fooarray( 1, 2, 3 )$baz . '-5'$term .= 'X'
防止控制语句中左右括号出现空格:
foreach ( $foo as $bar ) { ...定义函数时,使用如下空格:
function my_function( $param1 = 'foo', $param2 = 'bar' ) { ...function my_other_function() { ...
调用函数时:
my_function( $param1, func_param( $param2 ) );my_other_function();
必须 执行逻辑运算时: 小写字母并使用缩写形式 对于数组元素,仅当元素的索引是变量时,才在索引周围包含空格,例如: 在 同样,返回类型声明中冒号之前不应有空格: 除非另有说明,括号内应有空格。 格式化SQL语句时,如果SQL比较复杂,可以将SQL语句拆分成多行并缩进。当然,大多数SQL语句只需要一行。然后在 SQL 语句中使用大写的关键字(例如 对于需要更新数据库的函数参数,数据在提交前不应该进行SQL斜杠转义。转义应该尽可能接近查询时间执行,最好使用 $wpdb->prepare() 是一种处理 SQL 查询的转义、引用和整数转换的方法。它使用 sprintf() 格式的子集。示例: %s 用于字符串占位符,%d 用于整数占位符。请注意,它们没有被引用, 避免直接操作数据库,如果有定义的函数可以检索您需要的数据,请使用它。数据库抽象(使用函数而不是查询)有助于保持代码向前兼容,并且当查询结果缓存在内存中时,速度可以提高很多倍。 在变量名称、操作/过滤器名称和函数名称中使用小写字母。不要使用骆驼包。用下划线分隔单词。除非必要,否则不要使用缩写。使代码明确且不言自明: 类名必须首先大写并用下划线分隔,首字母缩略词必须全部大写: 常量名称必须大写并用下划线分隔 file❝名称以小写描述性字母,连字符 应分隔: 类文件名应以类名为基础,然后在前面添加 例如有一个文件叫 函数参数的自解释标志值 字符串值而不是 PHP在8.0之前不支持命名参数,但WordPress版本目前支持较旧的,但WordPress版本目前支持。尚未使用这些版本。 如果没有命名参数,标志的值就没有意义。每当我们遇到像上面例子这样的函数调用时,我们需要搜索函数定义来理解它的含义。您可以通过使用描述性字符串值而不是布尔值来使代码更具可读性。 当需要更多词汇来描述函数参数时, 动态钩子是标签名称中包含动态值的钩子,例如 HooK 标签中使用的变量应括在大括号 { 和 } 中,完整的外部标签名称应括在双引号中。这是为了确保 PHP 可以正确解析内插字符串中给出的变量。 如果可能的话,代号中的动态值也应该尽可能简洁明了。例如, 使用三元运算符是可以的,但是尽量让它们先测试 true,而不是 false,否则很容易混淆(一个例外是使用 Yoda表达式 当涉及变量的逻辑比较时,始终将变量放在右侧,将常量、字母或函数调用放在左侧。如果两边都不是变量,则顺序并不重要。 (用计算机科学术语来说,在比较时总是尝试将左值放在右边,将右值放在左边。) 在上面的例子中,如果省略了等号(承认吧,即使我们当中最有经验的人都会犯这个错误),你会得到一个解析错误,因为如果语句相反( Yoda 表达式适用于 一般来说,代码的可读性比聪明和简洁更重要: 上面的代码虽然聪明,但如果你不熟悉它,需要一些时间才能理解。因此,让我们这样写: 除非绝对必要,否则不应使用松散比较,因为它们可能会产生误导。 正确: 错误: 条件表达式中最好不要赋值: 正确:❀ong:♿r可以:♿r-表达式:♿r放在一起。但是,如果案例包含直接进入下一个代码块的代码,则必须对其进行显式注释。不得使用 引用 PHP 文档: PHP 支持一种错误检查运算符:at 符号 (@)。将表达式添加到 PHP 后,该表达式可能生成的任何诊断错误都将被抑制。 虽然这个运算符存在于 WordPress 核心代码中,但它经常被懒惰地使用,而不是进行适当的错误检查。强烈建议不要使用它,甚至 PHP 文档也说: 警告:在 PHP 8.0.0 之前,@ 运算符可以禁用会终止脚本执行的严重错误。例如,在不存在的函数调用前添加@会导致脚本因不可用或打字错误而退出而不解释原因。 (int) 代替 (integer) , (bool),浮点类型转换请使用 (浮动)代替(real),因为(real)(real)❀c在PHP 7中被删除,是在PHP中规定的。 8. 。并且 foreach ( (array) $foo as $bar ) { ...$foo = (bool) $bar;$x = $foo['bar']; // 正确$x = $foo[ 'bar' ]; // 错误 $x = $foo[0]; // 正确$x = $foo[ 0 ]; // 错误 $x = $foo[ $bar ]; // 正确$x = $foo[$bar]; // 错误switch 代码中,大约为 。 提交和冒号之间不应有空格: switch ( $foo ) { case 'bar': // 正确 case 'ba' : // 错误}function sum( $a, $b ): float { return $a + $b;}if ( $foo && ( $bar || $baz ) ) { ...my_function( ( $x - 1 ) * 5, $y );格式化SQL语句
UPDATE 或 WHERE)。 $wpdb->prepare() 继续。 $wpdb->prepare() 是一种用于对 SQL 查询进行转义、引用和整数转换操作的方法。它是 sprintf() 格式方法的一部分。例如:$var = "dangerous'"; // 可能未转义的原始数据$id = some_foo_number(); // 期待是整形的数据,但是不能确定 $wpdb->query( $wpdb->prepare( "UPDATE $wpdb->posts SET post_title = %s WHERE ID = %d", $var, $id ) );$wpdb->prepare() 将完成转义和引用工作。 数据库查询
命名约定
function some_name( $some_variable ) { [...] }class Walker_Category extends Walker { [...] }class WP_HTTP { [...] }my-plugin-name.phpclass-,然后将类名中的下划线替换为连字符,例如WP_Error 的文件名:class-wp-error.phpwp-includes 目录中包含 function-template-tag 函数的文件,使 end-filename 明显具有 - end-filename 。 general-template.php每个文件只有一个对象结构(类/接口/函数)
class-example-class.php,它只包含一个类: 第二个类应该位于其自己的文件中,名为 class-example-class-extended.php:// 正确:文件 class-example-class-extended.php.class Example_Class_Extended { [...] }// 正确:文件 class-example-class-extended.php.class Example_Class_Extended { [...] }true和false:// 错误function eat( $what, $slowly = true ) {...}eat( 'mushrooms' );eat( 'mushrooms', true ); // true 是什么意思呢?eat( 'dogfood', false ); // false 又是什么意思呢?false 的反面?// 正确function eat( $what, $speed = 'slowly' ) {...}eat( 'mushrooms' );eat( 'mushrooms', 'slowly' );eat( 'dogfood', 'quickly' );$args数组参数可能是更好的模式: // 更好function eat( $what, $args ) {...}eat ( 'noodles', array( 'speed' => 'moderate' ) );动态 钩子的插值命名以提高可读性, 出于动态钩子的目的应使用以下方式命名插值而不是串联。
{$new_status}_{$post->post_type}(publish_post)。 do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );$user_id比$this->id更清晰。 三元运算符
!empty ()♝ 因为它是更直观的是这里是错误的)。 和 ! // (if statement is true) ? (do this) : (else, do this);$musictype = ( 'jazz' === $music ) ? 'cool' : 'blah';// (if field is not empty ) ? (do this) : (else, do this);if ( true === $the_force ) { $victorious = you_will( $be );}$the_force = true ),你不能将常量指定为true,赋值将完全有效并返回1、导致if语句结果为true。此类错误可能会花费您很长时间来排除故障。 ==、!=、❙、、 .> 阅读困难,不建议使用。 “智能”代码
isset( $var) || $var= some_function();if ( ! isset( $var ) ) { $var = some_function();}if ( 0 === strpos( 'WordPress', 'foo' ) ) { echo __( 'Yay WordPress!' );}if ( 0 == strpos( 'WordPress', 'foo' ) ) { echo __( 'Yay WordPress!' );}
switch ( $foo ) { case 'bar': // 正确,空的 case 无需注释 case 'baz': echo $foo; // 错误, 含有代码的 case 必须 break,return 或者含有注释 case 'cat': echo 'mouse'; break; // 正确,有 break 的 case 无需注释 case 'dog': echo 'horse'; // no break // 正确,含有注释的 case 可以不要 break。 case 'fish': echo 'bird'; break;}goto 语句。 eval() 极其危险,无法保证安全。函数create_function()对应于eval()的内部执行。自 PHP 7.2 起已被弃用,并在 PHP 8.0 中被删除,因此无法使用。 错误检查运算符 @
不要使用
extract()extract()是一个非常糟糕的函数,它使代码更难调试,更难理解,我们不应该使用它并删除现有代码 All用于.
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网
