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>
<?php
echo 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 === 23
foo && bar
! foo
array( 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.php
class-
,然后将类名中的下划线替换为连字符,例如WP_Error
的文件名:class-wp-error.php
wp-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前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。