Code前端首页关于Code前端联系我们

WordPress PHP 编码规范吐血整理5000字

terry 2年前 (2023-09-24) 阅读数 55 #后端开发
由于主题和插件的复杂性,WordPress PHP 代码标准编译为 5000 字。您可以选择遵循不同的编码风格。

但是,这个编码规范不仅仅涉及编码风格,还包括 WordPress 生态系统中互操作性、可翻译性和安全性的最佳实践。因此,即使使用其他编码风格,仍然建议开发人员使用仍然遵守 WordPress 编码标准的最佳实践方面。

WordPress PHP 编码规范吐血整理5000字

目前,并非所有核心代码都完全符合此规范,但所有最近提交和/或更新的代码都需要完全符合。

对于开发者来说,如果你想按照这个规范自动检查你的代码,可以使用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 ifif|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 === 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();

必须 执行逻辑运算时: 小写字母并使用缩写形式 (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语句

格式化SQL语句时,如果SQL比较复杂,可以将SQL语句拆分成多行并缩进。当然,大多数SQL语句只需要一行。然后在 SQL 语句中使用大写的关键字(例如 UPDATEWHERE)。

对于需要更新数据库的函数参数,数据在提交前不应该进行SQL斜杠转义。转义应该尽可能接近查询时间执行,最好使用 $wpdb->prepare() 继续。

$wpdb->prepare() 是一种处理 SQL 查询的转义、引用和整数转换的方法。它使用 sprintf() 格式的子集。示例:

$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 ) );

%s 用于字符串占位符,%d 用于整数占位符。请注意,它们没有被引用,$wpdb->prepare() 将完成转义和引用工作。

数据库查询

避免直接操作数据库,如果有定义的函数可以检索您需要的数据,请使用它。数据库抽象(使用函数而不是查询)有助于保持代码向前兼容,并且当查询结果缓存在内存中时,速度可以提高很多倍。

命名约定

在变量名称、操作/过滤器名称和函数名称中使用小写字母。不要使用骆驼包。用下划线分隔单词。除非必要,否则不要使用缩写。使代码明确且不言自明:

function some_name( $some_variable ) { [...] }

类名必须首先大写并用下划线分隔,首字母缩略词必须全部大写:

class Walker_Category extends Walker { [...] }class WP_HTTP { [...] }

常量名称必须大写并用下划线分隔 file❝名称以小写描述性字母,连字符 应分隔:

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 { [...] }

函数参数的自解释标志值 字符串值而不是truefalse

// 错误function eat( $what, $slowly = true ) {...}eat( 'mushrooms' );eat( 'mushrooms', true ); // true 是什么意思呢?eat( 'dogfood', false ); // false 又是什么意思呢?false 的反面?

PHP在8.0之前不支持命名参数,但WordPress版本目前支持较旧的,但WordPress版本目前支持。尚未使用这些版本。

如果没有命名参数,标志的值就没有意义。每当我们遇到像上面例子这样的函数调用时,我们需要搜索函数定义来理解它的含义。您可以通过使用描述性字符串值而不是布尔值来使代码更具可读性。

// 正确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)。

HooK 标签中使用的变量应括在大括号 { 和 } 中,完整的外部标签名称应括在双引号中。这是为了确保 PHP 可以正确解析内插字符串中给出的变量。

do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );

如果可能的话,代号中的动态值也应该尽可能简洁明了。例如,$user_id$this->id更清晰。

三元运算符

使用三元运算符是可以的,但是尽量让它们先测试 true,而不是 false,否则很容易混淆(一个例外是使用 !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);

Yoda表达式

if ( true === $the_force ) {    $victorious = you_will( $be );}

当涉及变量的逻辑比较时,始终将变量放在右侧,将常量、字母或函数调用放在左侧。如果两边都不是变量,则顺序并不重要。 (用计算机科学术语来说,在比较时总是尝试将左值放在右边,将右值放在左边。)

在上面的例子中,如果省略了等号(承认吧,即使我们当中最有经验的人都会犯这个错误),你会得到一个解析错误,因为如果语句相反($the_force = true ),你不能将常量指定为true,赋值将完全有效并返回1、导致if语句结果为true。此类错误可能会花费您很长时间来排除故障。

Yoda 表达式适用于 ==!=、❙

和 !

。并且 .> 阅读困难,不建议使用。

“智能”代码

一般来说,代码的可读性比聪明和简洁更重要:

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!' );}

条件表达式中最好不要赋值:

正确:❀ong:♿r可以:♿r-表达式:♿r放在一起。但是,如果案例包含直接进入下一个代码块的代码,则必须对其进行显式注释。不得使用

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 中被删除,因此无法使用。

错误检查运算符 @

引用 PHP 文档:

PHP 支持一种错误检查运算符:at 符号 (@)。将表达式添加到 PHP 后,该表达式可能生成的任何诊断错误都将被抑制。

虽然这个运算符存在于 WordPress 核心代码中,但它经常被懒惰地使用,而不是进行适当的错误检查。强烈建议不要使用它,甚至 PHP 文档也说:

警告:在 PHP 8.0.0 之前,@ 运算符可以禁用会终止脚本执行的严重错误。例如,在不存在的函数调用前添加@会导致脚本因不可用或打字错误而退出而不解释原因。

不要使用extract()

extract()是一个非常糟糕的函数,它使代码更难调试,更难理解,我们不应该使用它并删除现有代码 All用于.

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门