PHP 8.1 是 PHP 语言的最新次要版本,针对于之前的版本,php8.1都有哪些语法和功能上的改进呢?下面让我们一起来讨论下吧~
PHP 交互式 Shell 需要 readline 扩展
MySQLi 默认错误模式设置为异常
CSV 写入函数的可自定义行尾
新version_compare操作员限制
HTML 编码和解码函数现在使用 ENT_QUOTES | ENT_SUBSTITUTE
非法紧凑函数调用警告(Warning on Illegal compact Function Calls)
资源到类对象的新迁移
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.
在 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 中引入的类似更改。
在 PHP 8.1 之前,PHP 的内置CSV写入函数fputcsv
和SplFileObject::fputcsv
被硬编码以\n
在每行末尾添加(或换行符)。
PHP 8.1 添加了对命名eol为这些函数的新参数的支持。你可以使用它来传递可配置的行尾字符。默认情况下,它仍然使用\n 字符。因此,你可以继续在现有代码中使用它。
标准字符转义规则适用于使用行尾字符。如果要使用\r
、\n
或\r\n
作为 EOL 字符,必须将它们括在双引号中。
PHP 的version_compare()
函数比较两个版本号字符串。此函数接受调用operator
以测试特定关系的可选第三个参数。
尽管文档中没有明确介绍,但在 PHP 8.1 之前,你可以将此参数设置为部分值(例如g
、l
、n
)而不会遇到错误。
version_compare()
PHP 8.1 对函数的参数添加了更严格的限制operator
来克服这种情况。你现在可以使用的唯一运算符是:
==、=和eq !=、<>和ne >和gt >=和ge <和lt <=和le
不再有部分运算符值。
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类对象
PHP 的Pspell 扩展允许你检查拼写和单词建议。
PHP <8.1 已使用pspell
和pspell config
具有整数标识符的资源对象类型。这两个资源对象现在被替换为PSpell\Dictionary
和PSpell\Config
类对象。
与之前的迁移一样,之前接受或返回资源对象标识符的所有 Pspell 函数都将采用新的类对象实例。
请在支付页面继续完成支付