PHP 8.2 的新增功能:全面概述
已发表: 2023-10-17PHP 是广泛使用的服务器端脚本语言,它不断发展以满足不断变化的 Web 开发需求。 PHP 8.2 于 2022 年 11 月发布,带来了许多令人兴奋的功能、重要的弃用和关键的错误修复。 在本文中,我们将深入探讨 PHP 8.2 新增功能的值得注意的方面,阐明开发人员可以从这个最新版本中获得什么。
目录
新功能
1. 枚举:类型安全简介
8.2 版也许是 PHP 最令人期待的新增功能之一,它终于引入了对枚举 (enum) 的本机支持。 枚举允许开发人员定义一组具有显式类型的命名值,为 PHP 添加了重要的类型安全层。
这是枚举如何工作的一个简单示例:
enum Color { case RED; case GREEN; case BLUE; }
枚举还可以具有关联值,使其适用于各种用例。 此功能特别有利于确保您的代码保持可读性、可维护性,并且不易出现因滥用常量或幻数而产生的错误。
2. 构造函数提升:减少样板代码
PHP 8.2 引入了构造函数提升,该功能旨在简化类定义并减少样板代码。 通过构造函数提升,您可以直接在构造函数的参数列表中声明和初始化类属性。 这消除了单独的属性声明的需要,使您的代码更简洁且更易于维护。
class User { public function __construct( public string $name, public string $email, public ?string $bio = null ) {} }
在处理具有许多属性的类时,构造函数提升尤其有价值,因为它可以减少代码库中的混乱。
3.只读类
在 PHP 8.2 中,只读类使开发人员能够定义具有只能设置一次的属性的类,通常是在对象创建期间。 这确保了属性在对象的整个生命周期中保持不变。 只读属性使用 readonly 修饰符声明,并且必须在类构造函数中初始化它们。
使用 PHP 8.2,该过程得到彻底简化:
class ReadOnlyClass $publicpassword , #[\SensitiveParameter] $secretpassword ) { throw new \Exception('Error'); } passwords('publicpassword', 'secretpassword');
4.“include”和“require”语句中的命名参数
在 PHP 8.2 中,现在可以在包含或需要文件时使用命名参数。 此功能增强了代码的可读性,特别是在处理接受多个参数的函数时。
include filename: 'my_file.php', once: true;
通过为这些参数提供名称,可以使代码更加不言自明,并减少由于参数顺序不正确而引入错误的可能性。
5. 隐式括号的弃用通知
为了提高代码的一致性和可读性,PHP 8.2 引入了对不带括号调用的函数和方法的弃用通知。 虽然还不是一个错误,但这可以作为一个警告,警告开发人员接受在调用函数时一致使用括号的推荐做法。
// Deprecated usage myFunction; // Recommended usage myFunction();
通过阻止隐式括号,PHP 旨在增强代码的清晰度和可维护性。
6. 支持隐藏敏感参数值
PHP 提供了在任何给定程序状态下监视调用堆栈的功能,这在解决应用程序问题时特别有价值。 然而,在某些情况下,堆栈跟踪可能包含需要隐藏的机密细节。
在 PHP 8.2 中,将引入一个名为“SensitiveParameter”的新颖属性。 此属性用于在应用程序遇到错误时混淆敏感数据,使其不被显示或记录。 实际上,它的用法如下:
function passwords( $publicpassword , #[\SensitiveParameter] $secretpassword ) { throw new \Exception('Error'); } passwords('publicpassword', 'secretpassword');
7. mysqli_execute_query函数和mysqli::execute_query方法介绍
PHP 是用于 Web 开发的多功能脚本语言,不断发展以增强其功能和易用性。 在 PHP 8.2 中,开发人员可以预见将引入两个新功能:mysqli_execute_query 函数和 mysqli::execute_query 方法。 这些新增功能旨在简化数据库交互,使使用 MySQL 数据库变得更加方便。
mysqli_execute_query 函数
mysqli_execute_query 函数是 PHP MySQLi 扩展的强大补充。 它专门针对 MySQL 数据库执行 SQL 查询。 该函数提供了一种简单有效的方式来发送 SQL 查询和检索结果。 以下是其用法的简短示例:
$mysqli = new mysqli("localhost", "username", "password", "database"); $sql = "SELECT * FROM users WHERE status = ?"; $stmt = $mysqli->prepare($sql); $status = "active"; $stmt->bind_param("s", $status); $result = mysqli_execute_query($stmt); while ($row = $result->fetch_assoc()) { } $stmt->close(); $mysqli->close();
mysqli_execute_query 函数简化了准备和执行查询的过程,同时通过参数绑定保持安全性。
mysqli::execute_query 方法
除了新函数之外,PHP 8.2 还引入了 mysqli::execute_query 方法作为 MySQLi 类的一部分。 此方法为喜欢面向对象编程的开发人员简化了查询执行。 这是其用法的示例:
$mysqli = new mysqli("localhost", "username", "password", "database"); $sql = "SELECT * FROM products WHERE category = ?"; $stmt = $mysqli->prepare($sql); $category = "electronics"; $stmt->bind_param("s", $category); $result = $stmt->execute_query(); while ($row = $result->fetch_assoc()) {} $stmt->close(); $mysqli->close();
mysqli::execute_query 方法提供了一种面向对象的方法来执行数据库查询,为喜欢这种编码风格的开发人员提供了更直观的体验。
8. 允许特征中存在常量:增强代码的可重用性和可维护性
Traits 是包括 PHP 在内的现代编程语言中的一项重要功能,它允许开发人员在不同的类之间重用代码,而无需继承。 PHP Trait 主要提供方法,但在 PHP 8.2 中,引入了一个显着的增强:在 Trait 中定义常量的能力。 此功能旨在改进代码组织、可重用性和可维护性,为开发人员提供更大的代码设计灵活性。
PHP 中 Traits 的作用
在深入研究 Trait 中添加常量之前,我们先简单回顾一下 Trait 在 PHP 中的作用。 Traits 是 PHP 等单继承语言中代码重用的机制。 它们允许您定义一组可以在多个类中重用的方法。 当类使用特征时,它会继承该特征中定义的方法,从而增强代码模块化并减少冗余。
trait Loggable { public function log($message) { }} class User { use Loggable; public function register() { $this->log('User registered.'); }}
在此示例中,Loggable Trait 提供了一个 log 方法,任何包含该 Trait 的类都可以使用该方法,从而提高了代码的可维护性和组织性。
特征中的常量:一个新功能
在 PHP 8.2 中,开发人员现在可以在特征中定义常量,这在以前的 PHP 版本中是不可能的。 特征中的常量与类中的常量类似,但可以在使用该特征的类中访问它们。
trait Configuration {
const MAX_CONNECTIONS = 10;
}class Database {
use Configuration;
public function connect() { $maxConnections = self::MAX_CONNECTIONS; } }
在此示例中,Configuration 特征定义了 MAX_CONNECTIONS 常量,可以在使用该特征的 Database 类中访问该常量。 这允许集中配置常量并促进更有组织和可维护的代码结构。
9. PHP 8.2 中引入新的析取范式 (DNF) 类型
PHP 是一种动态且多功能的脚本语言,不断发展以满足 Web 开发不断增长的需求。 随着 PHP 8.2 的发布,开发人员将享受到新的析取范式 (DNF) 类型的引入。 该语言的这一新增功能增强了 PHP 的表达能力和灵活性,使开发人员能够更有效地处理复杂的逻辑表达式。
了解析取范式 (DNF)
在深入研究 PHP 8.2 中的新 DNF 类型之前,有必要了解析取范式 (DNF) 在逻辑中代表什么。 DNF 是表示逻辑表达式的规范形式,其中每个表达式都是连词 (AND) 的析取 (OR)。 简单来说,它是一种将复杂的逻辑语句分解为一系列由 OR 运算符连接的简单条件的方法。
例如,DNF 中的逻辑表达式 (A AND B) OR (C AND D) 是因为它是两个连词的或取。
PHP 8.2 中的新 DNF 类型
PHP 8.2 引入了新的 DNF 类型,作为更直观地使用和操作逻辑表达式的方式。 这些 DNF 类型提供了处理复杂逻辑的更高级别的抽象,使开发人员可以更轻松地管理代码中的复杂条件。
以下是新 DNF 类型及其使用方法的概述:
1. 析取范式
DisjunctiveNormalForm 类型表示 DNF 中的逻辑表达式。 您可以创建实例 DisjunctiveNormalForm 来封装复杂的条件:
$dnfExpression = new DisjunctiveNormalForm(
new Conjunction('A', 'B'),
new Conjunction('C', 'D')
);
在此示例中,$dnfExpression 表示 DNF 表达式 (A AND B) OR (C AND D)。
2. 连词
连接类型表示一个或多个条件的连接 (AND)。 您可以创建 Conjunction 实例来构建复杂的连词:
$conjunction = new Conjunction('A', 'B', 'C');
这里,$conjunction 代表连词(A AND B AND C)。
3.逻辑值
LogicalValue 类型表示简单的逻辑值,可以是 true、false 或变量。 它可以与其他 DNF 类型结合使用来构建更复杂的表达式:
$value = new LogicalValue('A');
这里,$value代表逻辑变量A。
10. 引入AllowDynamicProperties属性:扩展PHP的灵活性
“AllowDynamicProperties”属性是 PHP 的一个显着补充,特别是对于重视该语言动态特性的开发人员而言。 使用此属性,您可以使对象能够接受和操作其类中未显式定义的属性。
以下是如何应用“AllowDynamicProperties”属性的简单示例:
class DynamicObject {
}
$dynamicObj = new DynamicObject();
$dynamicObj->newProperty = "This is a dynamic property.";
echo $dynamicObj->newProperty;
在此示例中,“DynamicObject”类标有“AllowDynamicProperties”属性,该属性允许动态添加和访问属性。 在处理需要适应各种数据结构的对象或处理来自外部源(例如 API)的数据时,这种动态行为特别有用。
PHP 8.2 中的弃用和删除
- 扩展: PHP 8.2 告别了几个过时且未维护的扩展,包括“oci8”、“mysql”、“mcrypt”和“interbase”。 强烈鼓励依赖这些扩展的开发人员迁移到现代替代方案,以确保其应用程序的安全性和稳定性。
- each() 函数:each() 函数现已在 PHP 8.2 中正式弃用。 该函数用于通过推进内部指针并返回当前键值对来迭代数组。 然而,它有各种问题,并且很大程度上被 foreach 循环所取代,后者提供了更好的可读性和可维护性。
- create_function() 函数:create_function() 函数被标记为已弃用。 该函数用于动态创建匿名函数,但由于安全问题和闭包等更好的替代方案,不推荐使用。
- FILTER_SANITIZE_MAGIC_QUOTES 过滤器标志:FILTER_SANITIZE_MAGIC_QUOTES 过滤器标志已弃用。 该标志与 filter_var() 一起使用,通过在单引号和双引号等字符前添加斜杠来清理输入。 现代最佳实践建议使用准备好的语句和参数化查询来处理数据库输入,从而使该标志过时。
- stristr() 函数:stristr() 函数对字符串中的子字符串执行不区分大小写的搜索,已被弃用。 虽然它仍然有效,但鼓励开发人员使用不区分大小写的版本 stripos() 或替代品 str_contains() 以获得更好的清晰度。
- 带有数组参数的define() :现在不推荐使用define() 来定义带有数组的常量作为值。 尽管可以用数组定义常量作为值,但这种做法被认为是非常规的,常量通常应该具有标量值。
- SORT_NUMERIC 和 SORT_REGULAR 标志:用于排序函数(如 sort() 和 usort())的 SORT_NUMERIC 和 SORT_REGULAR 标志已被弃用。 不再需要这些标志,因为 PHP 会自动检测元素的数据类型并相应地对它们进行排序。
性能改进
PHP 8.2 带来了各种性能增强和优化。 虽然这些改进的程度可能会根据您的具体用例而有所不同,但升级到 PHP 8.2 可能会带来一些显着的性能优势。 这些改进可以对高流量的应用程序或执行资源密集型任务的应用程序产生重大影响,使它们更具响应性和效率。
错误修复和稳定性
与任何新的 PHP 版本一样,PHP 8.2 解决了许多错误和稳定性问题。 这些修复对于维护该语言的整体可靠性并确保 PHP 继续成为 Web 开发的稳健选择至关重要。
常见问题解答 - PHP 8.2 中的新增功能
为什么 PHP 8.2 中引入了隐式括号的弃用通知?
隐式括号的弃用通知通过警告开发人员在调用函数时使用括号来鼓励一致的代码风格。 这增强了代码的清晰度和可维护性。
什么是只读类,它们在 PHP 8.2 中如何工作?
PHP 8.2 中的只读类使得属性只能设置一次,通常是在对象创建期间,确保它们在对象的整个生命周期中保持不变。 只读属性是使用 readonly 修饰符声明的。
PHP 8.2 中 mysqli_execute_query 函数和 mysqli::execute_query 方法如何简化数据库交互?
这些功能简化了对 MySQL 数据库执行 SQL 查询的过程,提供了以过程方式或面向对象的方式发送查询和检索结果的高效且安全的方法。
“AllowDynamicProperties”属性如何扩展 PHP 8.2 中的灵活性?
“AllowDynamicProperties”属性允许对象接受和操作未在其类中显式定义的属性,从而增强了 PHP 的动态特性。
为什么错误修复和稳定性在 PHP 8.2 中很重要?
PHP 8.2 中的错误修复和稳定性改进对于维护该语言的整体可靠性至关重要,通过解决问题并增强其稳定性,确保 PHP 仍然是 Web 开发的可靠选择。
结论
总之,PHP 8.2 成为不断发展的 Web 开发领域的一个关键里程碑。 凭借广泛的创新功能、增强的灵活性和性能优化,它可以满足全球开发人员不断变化的需求。
枚举、构造函数提升、只读类、命名参数和AllowDynamicProperties 属性的引入使开发人员能够编写更清晰、更易于维护的代码。 此外,新的析取范式 (DNF) 类型为 PHP 带来了高级逻辑操作功能,进一步扩展了其多功能性。 然而,随着 PHP 的进步,它也告别了过时的扩展和功能,同时努力解决错误,确保它仍然是 Web 开发的可靠和安全的选择。
相关内容:
如何修复“WordPress 禁用需要更新 PHP”错误(2 种方法)
MySQL慢查询日志