登录  /  注册

PHP8.1的语法和功能都有哪些新变化?

大瓶可乐@php.cn
2022-10-28 11:52:43587

PHP 8.1 是 PHP 语言的最新次要版本,针对于之前的版本,php8.1都有哪些语法和功能上的改进呢?下面让我们一起来讨论下吧~

PHP 8.1 对其现有语法和功能的更改:

  • PHP 交互式 Shell 需要 readline 扩展

  • MySQLi 默认错误模式设置为异常

  • CSV 写入函数的可自定义行尾

  • 新version_compare操作员限制

  • HTML 编码和解码函数现在使用 ENT_QUOTES | ENT_SUBSTITUTE

  • 非法紧凑函数调用警告(Warning on Illegal compact Function Calls)

  • 资源到类对象的新迁移

PHP 交互式 Shell 需要readline扩展

PHP 的readline扩展支持交互式 shell功能,例如导航、自动完成、编辑等。虽然它与 PHP 捆绑在一起,但默认情况下未启用。

你可以使用 PHP CLI-a命令行选项访问 PHP 交互式 shell:

php -a
Interactive shell
php >
php > echo "Hello";
Hello
php > function test() {
php { echo "Hello";
php { }
php > test();
Hello

在 PHP 8.1 之前,即使没有启用readline扩展,你也可以使用 PHP CLI 打开交互式 shell。正如预期的那样,shell 的交互功能不起作用,使-a选项变得毫无意义。

在 PHP 8.1 CLI 中,如果你没有启用 readline 扩展,交互式 shell 将退出并显示错误消息。

php -a
Interactive shell (-a) requires the readline extension.

MySQLi 默认错误模式设置为异常

在 PHP 8.1 之前,MySQLi默认不显示错误。这种行为通常会导致代码没有遵循严格的错误/异常处理。开发人员必须实现自己的显式错误处理功能。

PHP 8.1 通过将 MySQLi 的默认错误报告模式设置为抛出异常来改变这种行为。

Fatal error: Uncaught mysqli_sql_exception: Connection refused in ...:...

由于这是一个重大更改,对于 PHP <8.1 版本,你应该mysqli_report在建立第一个 MySQLi 连接之前使用该函数显式设置错误处理模式。或者,你可以通过实例化mysqli_driver实例来选择错误报告值来执行相同操作。

RFC 遵循PHP 8.0 中引入的类似更改。

CSV 写入函数的可自定义行尾

在 PHP 8.1 之前,PHP 的内置CSV写入函数fputcsvSplFileObject::fputcsv被硬编码以\n 在每行末尾添加(或换行符)。

PHP 8.1 添加了对命名eol为这些函数的新参数的支持。你可以使用它来传递可配置的行尾字符。默认情况下,它仍然使用\n 字符。因此,你可以继续在现有代码中使用它。

标准字符转义规则适用于使用行尾字符。如果要使用\r\n\r\n作为 EOL 字符,必须将它们括在双引号中。

新的version_compare运营商限制

PHP 的version_compare()函数比较两个版本号字符串。此函数接受调用operator以测试特定关系的可选第三个参数。

尽管文档中没有明确介绍,但在 PHP 8.1 之前,你可以将此参数设置为部分值(例如gln)而不会遇到错误。

version_compare()PHP 8.1 对函数的参数添加了更严格的限制operator来克服这种情况。你现在可以使用的唯一运算符是:

==、=和eq
!=、<>和ne
>和gt
>=和ge
<和lt
<=和le

不再有部分运算符值。

现在使用 HTML 编码和解码函数ENT_QUOTES | ENT_SUBSTITUTE

HTML 实体是字符的文本表示,否则将被解释为 HTML。想想像<和>这样用来定义HTML标记的字符,例如<a>、<h3>、<script>

is & lt;(小于符号)和is & gt;(大于符号)的 HTML 实体。

注意:删除“&”和“amp”之间的空格。

你可以在 HTML 文档中安全地使用这些 HTML 实体,而无需触发浏览器的呈现引擎。

例如,& lt;script& gt;<script>在浏览器中显示,而不是被解释为 HTML 标记。

在 PHP 8.1 之前,htmlspecialchars()htmlentities()函数将"<>&等符号转换为它们各自的 HTML 实体。但是默认情况下,他们没有将单引号字符 ( ') 转换为其 HTML 实体。此外,如果文本中存在格式错误的 UTF-8,它们会返回一个空字符串。

在 PHP 8.1 中,这些 HTML 编码和解码函数(以及它们的相关函数)也会默认将单引号字符转换为它们的 HTML 实体。

如果给定文本包含无效字符,函数将用 Unicode 替换字符 (?) 替换它们,而不是返回空字符串。PHP 8.1 通过将这些函数的签名更改为ENT_QUOTES | ENT_SUBSTITUTE而不是ENT_COMPAT默认来实现这一点。

大多数框架已经将ENT_QUOTES其用作默认标志值。因此,由于此更改,你不会看到太大的差异。然而,新ENT_SUBSTITUTE标志并没有被广泛使用。PHP 8.1 将导致无效的 UTF-8 字符被替换为 ? 字符,而不是返回空字符串。

非法紧凑函数调用警告

PHP的compact()功能超级好用。你可以使用它来使用变量的名称和值创建一个数组。

例如,考虑以下代码:

$animal = 'Cat';
$sound = 'Meow';
$region = 'Istanbul';
compact('animal', 'sound', 'region');
// ['animal' => "Cat", 'sound' => "Meow", 'region' => "Istanbul"]

compact 函数的文档指出它只接受字符串参数或带有字符串值的数组值。但是,在 PHP 7.3 之前,任何未设置的字符串都将被静默跳过。

PHP 7.3 修改了这个compact()函数,如果你使用未定义的变量会抛出一个通知。PHP 8.1 更进一步并发出警告。

你可以阅读其 GitHub 页面以了解此更改是如何发生的。

从资源到类对象的新迁移

PHP 的长期目标之一是从资源转向标准类对象。

由于历史原因,资源对象在 PHP 应用程序中被广泛使用。因此,资源到类对象的迁移需要尽可能减少破坏性。PHP 8.1 迁移了五个这样的资源:

file_info迁移到finfo对象的资源

PHP 的finfo 类为函数提供了一个面向对象的接口fileinfo。但是,使用finfo函数会返回resource具有类型的对象,file_info而不是finfo类本身的实例。

PHP 8.1 修复了这个异常。

迁移到IMAP\Connection类对象的 IMAP 资源

根据资源到对象的迁移目标,IMAP\Connection当 PHP 最终修改类的实现细节时,新类将潜在的破坏性更改降至最低。

这个新类也被声明final了,所以你不能这样extend。

FTP 连接资源现在是FTP\Connection类对象

在 PHP <8.1 中,如果你使用or函数创建FTP 连接,你将获得ftp类型的资源对象。ftp_connect()ftp_ssl_connect()

PHP 8.1 添加了新的FTP\Connection类来纠正这个问题。和类一样IMAP\Connection,它也被声明final为防止它被扩展。

迁移到GdFont类对象的字体标识符

PHP 的 GD 扩展提供了imageloadfont() 函数来加载用户定义的位图并返回其字体标识符资源 ID(整数)。

在 PHP 8.1 中,此函数将改为返回GdFont类实例。此外,为了使迁移无忧,以前接受资源 ID 的所有函数imageloadfont()现在都将采用新的GdFont类对象。

迁移到对象的 LDAP 资源

LDAP或轻量级目录访问协议用于访问“目录服务器”。就像硬盘目录结构一样,它是一个独特的数据库,以树状结构保存数据。

PHP 包含一个 LDAP 扩展,它在 PHP 8.1 之前接受或返回资源对象。但是,它们现在都已无缝迁移到新的类实例。已转换的资源类型有:

  • ldap link资源到\LDAP\Connection类对象

  • ldap result资源到\LDAP\Result类对象

  • ldap result entry资源到\LDAP\ResultEntry类对象

Pspell 资源现在是类对象

PHP 的Pspell 扩展允许你检查拼写和单词建议。

PHP <8.1 已使用pspellpspell config具有整数标识符的资源对象类型。这两个资源对象现在被替换为PSpell\DictionaryPSpell\Config类对象。

与之前的迁移一样,之前接受或返回资源对象标识符的所有 Pspell 函数都将采用新的类对象实例。


大瓶可乐@php.cn
总阅读量:587
关注
关于我们免责申明意见反馈讲师合作广告合作赞助与捐赠
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2022 https://www.php.cn/ All Rights Reserved | 苏州跃动光标网络科技有限公司 | 苏ICP备2020058653号-1

 | 本站CDN由 数掘科技 提供

等待您完成支付...

请在支付页面继续完成支付

支付完成
重新选择支付方式