为什么了解PHP版本兼容性很重要,哪里能找到PHP版本更新的相关信息,以及如何用两种方法来测试你的插件和主题是否支持最新的PHP版本。
为什么要测试 PHP 版本兼容性?
WordPress是用PHP语言编写的,这意味着它需要在网站主机支持的PHP版本上顺利运行。虽然WordPress会推荐一个最低的PHP版本要求,但是老版本的PHP会逐渐停止更新,甚至不再提供安全补丁。
比如说,现在WordPress推荐至少使用的PHP版本是7.4,但这个版本在2022年11月28日就已经停止更新了。
WordPress核心代码能够在PHP 8.0 和 PHP 8.1上运行,并且也支持PHP 8.2 和 PHP 8.3的版本。但是,并不是所有的插件都能保证在这些新版本的PHP上正常工作。
所以,如果你是一个插件开发者,定期检测你的插件与不同PHP版本的兼容性是非常重要的。
在哪里可以找到有关 PHP 版本更改的信息
为了了解 PHP 版本何时以及如何更改,最好访问 PHP 官方网站 https://www.php.net/。
在“支持的版本”页面上,您可以找到有关当前支持哪些版本、支持级别以及哪些版本已停止使用的信息。
截至本记录时,所有 PHP 7.x 版本均已终止生命周期,PHP 8.0 仅支持安全修复,并且积极支持 PHP 8.1 以及 PHP 8.2 和 8.3,这意味着错误和安全缺陷将得到修复。请注意,PHP 8.0 仅在 2023 年 11 月之前支持安全修复,大约在 PHP 8.3 发布的时间,然后 PHP 8.0 将被视为生命周期结束。
在 PHP 文档的附录部分中,您可以找到有关从旧 PHP 版本迁移的指南,其中列出了旧版本和新版本之间最重要的更改。例如,从 PHP 7.4.x 迁移到 PHP 8.0.x指南列出了 PHP 7.4 和 PHP 8.0 之间最重要的变化。
示例插件
<?php
/**
* Plugin Name: WP Learn Compatibility
* Description: Learn to test a plugin for PHP Version Compatibility
* Version: 1.0.1
*
* @package wp-learn-compatibility
*/
/**
* Posts fetcher class
*/
class Post_Fetcher {
/**
* Array posts
*
* @var array
*/
protected $posts;
/**
* Fetch the WordPress posts
*/
public function post_fetcher() {
$this->posts = get_posts();
}
/**
* Fetch the posts and return the formatted HTML
*
* @return string
*/
public function fetch_posts() {
$post_html = '<div class="post">';
foreach ( $this->posts as $post ) {
if ( property_exists( $post, 'post_title' ) ) {
$post_html .= sprintf(
'<h4><a href="%s">%s</a></h4>',
get_permalink( $post->ID ),
$post->post_title
);
}
}
$post_html .= '</div>';
return $post_html;
}
}
add_shortcode( 'wp_learn_php_compatibility', 'wp_learn_php_compatibility_shortcode_render' );
/**
* Shortcode callback function for wp_learn_php_compatibility shortcode
*
* @return string
*/
function wp_learn_php_compatibility_shortcode_render() {
$post_fetcher = new post_fetcher();
$post_html = $post_fetcher->fetch_posts();
return $post_html;
}
在这个教程中,我们将通过一个示例插件来学习。这个插件可以创建一个特殊的短代码,当你在页面上使用这个短代码时,它会显示一个帖子列表,包括每篇帖子的标题。一个名为post_fetcher
的类负责获取这些帖子信息。
当你在使用PHP 7.4版本的服务器上测试这个短代码时,可以看到它能够正常工作,按照我们的预期显示帖子列表。
如何测试 PHP 版本兼容性
要检查PHP版本兼容性,有好几种不同的测试方式,这可能会涉及到使用不同版本的PHP和一些特殊的工具。在这篇教程里,我们会介绍两种测试方法,并且探讨每种方法的优势和可能的不足。
手动兼容性测试
手动测试方法需要你在WordPress环境中设置你想要测试的PHP版本,然后在这个环境里测试你的插件。
你可以通过几种不同的方式来搭建这样的环境,最常见的方法是使用一个可以轻松切换PHP版本的本地开发工具,比如Mamp、Laragon、LocalWP或DevKinsta。
以本教程为例,我们将选择PHP 8.1版本进行测试。
要快速确认你的WordPress正在使用哪个版本的PHP,你可以在WordPress安装目录下创建一个名为info.php的文件,并填入一段特定的代码。
<?php
phpinfo();
然后,在浏览器中导航到 info.php 文件,您应该会看到显示的 PHP 版本。
设置好测试环境后,您需要启用 WordPress 调试。
为此,请编辑该wp-config.php
文件,并更新定义常量的行WP_DEBUG
,将其设置为true
define( 'WP_DEBUG', true );
另外,添加WP_DEBUG_DISPLAY
常量并将其设置为 false,然后添加WP_DEBUG_LOG
常量并将其设置为 true,以便将错误记录到目录debug.log
中的文件中wp-content
。
define( 'WP_DEBUG_DISPLAY', false );
define( 'WP_DEBUG_LOG', true );
您还可以WP_DEBUG_LOG
通过指定文件路径将常量设置为自定义位置。例如:
define( 'WP_DEBUG_LOG', '/home/ubuntu/wp-local-env/sites/learnpress/logs/debug.' . date( 'Y-m-d' ) . '.log' );
然后,通过刷新页面来测试您的插件。请注意,短代码功能已损坏。
如果您查看 debug.log,您将看到显示以下错误:
[24-Nov-2023 12:59:49 UTC] PHP Warning: foreach() argument must be of type array|object, null given in /home/ubuntu/wp-local-env/sites/learnpress/wp-content/plugins/wp-learn-php-compatibility/wp-learn-php-compatibility.php on line 36
现在,如果您转到插件文件的第 36 行,您将看到以下代码,您将看到它正在尝试循环遍历该$this->posts
属性,该属性由于某种原因为 null。原因可能不是很明显,因此您可能需要深入研究从 PHP 7.4.x 迁移到 PHP 8.0.x指南。
在“向后不兼容更改”部分中,您会看到以下更改:
Methods with the same name as the class are no longer interpreted as constructors. The __construct() method should be used instead.
所以在这种情况下,我们的类构造函数方法需要更新。
修复后,刷新页面,您将看到该插件再次按预期工作。
虽然手动测试确实有效,但这是一个乏味的过程。幸运的是,您还可以使用名为 PHPUnit 的工具自动化大多数测试。这将使您能够持续保护代码免受错误和 PHP 兼容性问题的影响,但这超出了本教程的范围。
使用 PHPCompatibilityWP 扫描您的代码
您还可以使用一些工具来测试 PHP 兼容性,最有用的是恰当命名的PHPCompatibility工具,它是PHP_CodeSniffer工具的一组规则。
PHP_CodeSniffer 是一个命令行工具,可用于扫描代码中的错误和警告,而 PHPCompatibility 工具是一组规则,可与 PHP_CodeSniffer 一起使用来扫描代码中的 PHP 版本兼容性。
对于 WordPress 开发人员来说,有一个名为PHPCompatibilityWP的特定规则集,它是针对 WordPress 项目的 PHPCompatibility 规则集。
PHPCompatibility/PHPCompatibilityWP 的优点在于您无需配置不同的 PHP 版本即可使用它。您可以将它与现有的 PHP 版本一起使用,它会根据您指定的 PHP 版本的规则检查您的代码。
要安装和使用 PHPCompatibilityWP,您需要安装 Composer,它是 PHP 项目的依赖管理器。
为了让 Composer 工作,您还需要在计算机上安装 PHP,这样您就可以使用 PHP CLI 二进制文件,它允许您在终端中运行 PHP 脚本,而不仅仅是在浏览器中。
安装 Composer 不在本课程的讨论范围内,但您可以在Composer 网站上找到适用于macOS/Linux和Windows操作系统的说明。
您可以在PHP 网站的“安装和配置”部分找到在系统上安装 PHP 的方法。
安装 PHP 后,请确保将 PHP CLI 二进制文件的路径添加到计算机的操作系统路径中,以便您可以从计算机上的任何位置运行 PHP 命令。
您可以通过在终端中运行以下命令来检查是否已安装 PHP:
php -v
同样,您可以通过在终端中运行以下命令来检查是否已安装 Composer:
composer -V
安装 Composer 后,您可以通过在插件目录中运行以下命令来初始化 Composer 项目。如果您已经在插件中使用 Composer,则可以跳过此步骤。
composer init
这将在您的插件目录中初始化一个新的 Composer 项目。您可以接受大多数问题的默认值,但是当它要求您以交互方式定义依赖项(require)并以交互方式定义您的开发依赖项(require-dev)?时,您应该回答“否”。您还可以跳过 PSR-4 自动加载映射。
完成此操作后,您将拥有一个composer.json
文件,这是 Composer 用于管理项目依赖项的文件。
接下来,您需要安装 Composer 插件,通过从命令运行以下命令来管理 PHP_CodeSniffer 的安装路径设置。如果你已经安装了这个插件,可以忽略它。
composer config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true
然后,您可以通过运行以下命令来安装 Composer 安装程序插件和 PHPCompatibilityWP 工具:
composer require --dev dealerdirect/phpcodesniffer-composer-installer:"^1.0"
composer require --dev phpcompatibility/phpcompatibility-wp:"*"
这将在您的composer.json 文件中设置并安装所需的依赖项。
关于 PHPCompatibility 和 PHPCompatibilityWP 版本的说明。
目前, PHPCompatibility 的稳定版本是9.3.5,最近的嗅探是即将发布的版本 10.0.0 的一部分。发布。 PHPCompatibilityWP 当前的稳定版本是2.1.4
当PHPCompatibility 10.0版本发布时,PHPCompatibilityWP 3.0版本也会发布,这将依赖于PHPCompatibility 10.0版本。
同时,可以安装 PHPCompatibility 的 dev-develop 分支来运行 PHPCS,并在 PHPCompatibility 版本 10.0.0 中发布之前添加 PHP 8 嗅探的尖端功能,详细信息请参阅此WordPress VIP 文档。
为此,请运行以下命令为 PHPCompatibility 的 dev-develop 分支指定别名:
composer config minimum-stability dev
composer require --dev phpcompatibility/phpcompatibility-wp:"^2.1"
composer require --dev phpcompatibility/php-compatibility:"dev-develop as 9.99.99"
这些命令会将develop
PHPCompatibility 分支别名为 PHPCompatibility 允许范围内的 9.x 版本,并设置 PHPCompatibilityWP 安装最新的稳定 2.1 版本。
一旦 PHPCompatibility 10 和 PHPCompatibilityWP 3 发布,应该可以将 PHPCompatibilityWP 版本约束更新为“^3.0”,这将取决于 PHPCompatibility 的版本 10。
安装完所有这些后,您可以在插件文件上运行 PHPCompatibilityWP 工具。
建议的方法是针对特定的 PHP 基本版本运行 PHPCompatibilityWP。在此示例中,您可以通过将testVersion
运行时变量设置为 来针对 PHP 7.4 及更高版本运行它7.4-
。
./vendor/bin/phpcs --runtime-set testVersion 7.4- -p wp-learn-php-compatibility.php --standard=PHPCompatibilityWP
你会看到这个输出:
W 1 / 1 (100%)
FILE: /Users/jonathanbossenger/wp-local-env/sites/learnpress/wp-content/plugins/wp-learn-php-compatibility/wp-learn-php-compatibility.php
-----------------------------------------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
-----------------------------------------------------------------------------------------------------------------------------------------
15 | WARNING | Use of deprecated PHP4 style class constructor is not supported since PHP 7.
-----------------------------------------------------------------------------------------------------------------------------------------
Time: 33ms; Memory: 8MB
请注意如何报告与手动方法相同的错误,但这次更具体。它准确地告诉我们错误发生在哪一行以及错误是什么。
现在我们可以修复类构造函数错误。
注意事项
使用 PHPCompatibilityWP 等工具时的考虑因素之一是它无法检测到每个兼容性错误。
例如,从 PHP 7.4 到 PHP 8.0 的其他更改之一是删除了与对象一起使用的功能array_key_exists()
,而是property_exists()
应该使用类似的功能。
但是,PHPCompatibilityWP 工具不知道您传递给的变量array_key_exists()
是数组还是对象,因此它无法就此发出警告。
这就是自动化手动测试会派上用场的地方。当您在新的 PHP 环境中运行测试时,测试将失败,从而使您遇到可能的问题。启用日志记录后,您会看到错误记录到日志文件中。
最终,将 PHPCompatibility 这样的工具与我们讨论过的自动化测试和手动测试过程相结合,将允许您确保您的插件与当前和未来版本的 PHP 兼容。
暂无评论内容