PHP8.1近期已上线,那么新版的PHP有些什么更改呢,我们一起来看看
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写入函数fputcsv和SplFileObject::fputcsv被硬编码以\n 在每行末尾添加(或换行符)。
PHP 8.1 添加了对命名eol为这些函数的新参数的支持。你可以使用它来传递可配置的行尾字符。默认情况下,它仍然使用\n 字符。因此,你可以继续在现有代码中使用它。
标准字符转义规则适用于使用行尾字符。如果要使用\r、\n或\r\n作为 EOL 字符,必须将它们括在双引号中。
新的version_compare运营商限制
PHP 的version_compare()函数比较两个版本号字符串。此函数接受调用operator以测试特定关系的可选第三个参数。
尽管文档中没有明确介绍,但在 PHP 8.1 之前,你可以将此参数设置为部分值(例如g、l、n)而不会遇到错误。
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 已使用pspell和pspell config具有整数标识符的资源对象类型。这两个资源对象现在被替换为PSpell\Dictionary和PSpell\Config类对象。
与之前的迁移一样,之前接受或返回资源对象标识符的所有 Pspell 函数都将采用新的类对象实例。
以上信息部分来源于互联网
原创文章,作者:陌涛,如若转载,请注明出处:https://imotao.com/6976.html
微信扫一扫