PHP 8.1.x 更新内容

235 阅读3分钟

8.1 更新内容

新特性 ¶

PHP 核心 ¶

八进制整数文字表达前缀 ¶

类似于二进制和十六进制字面量表达方式,现在八进制整数可以在表示中使用更为清晰地前缀 0o/0O 。

<?php 014; // 无前缀的八进制表示 0o14; // 添加前缀的八进制表示 ?>

支持字符串类型键的数组解包 ¶

新增字符串类型键的数组解包

<?php $arr1 = [1, 'a' => 'b']; $arr2 = [...$arr1, 'c' => 'd']; //[1, 'a' => 'b', 'c' => 'd'] ?>

参数展开后命名参数 ¶

现在可以在参数展开后为命名参数。 例如: foo(...args,named:args, named: arg).

文件上传新增 full-path 键 ¶

现在文件上传新增了额外的 full_path 键, 这包含了上传文件的完整路径(不仅仅是返回路径中的文件名部分)。 这是为了与 “upload webkitdirectory” 结合使用。

枚举 ¶

新增枚举支持。

纤程 ¶

新增功能详见 Fibers 。

First Class 可调用语法 ¶

现在可调用闭包可以使用 myFunc(...) 语法创建,与 Closure::fromCallable('myFunc') 效果一样。

注意... 是语法的一部分,不是省略。

交集类型 ¶

新增功能详见交集类型

警告

交集类型不能与联合类型 一起使用。

Never 类型 ¶

新增一个新的仅仅返回类型 never。它表示函数要么 exit() ,要么抛出异常,要么不会终止。

在初始化中 new ¶

现在可以将 new ClassName() 语句作为参数、静态变量、初始化全局常量、注解参数的默认值。现在对象可以作为 define() 的参数了。

Readonly 属性 ¶

详见 readonly 。

Final 类常量 ¶

详见 final 常量修饰符。而且,接口常量默认可覆盖。。


新函数 ¶

PHP 核心中新增的函数 ¶

  • array_is_list(),判断指定的 array 是否是 list。如果 array 的 key 由 0 到 count($array)-1 的连续数字组成,则该数组就是 list。

不向后兼容的变更 ¶

PHP 内核 ¶

$GLOBALS 访问限制 ¶

现在访问 $GLOBALS 数组受到一些限制。 对单个数组元素的读写访问 $GLOBALS['var'] 与之前一样。 也将继续支持对整个数组 $GLOBALS 的只读访问。 但是,不再支持对整个 $GLOBALS 数组的写访问。 例如,array_pop($GLOBALS) 将返回错误。

在继承的方法中 static 变量的用法 

当一个方法使用继承的(而不是重写的)静态变量时,继承的方法将与父级共享这个静态变量。

在强制参数之前指定可选参数 ¶

现在在强制参数之前指定可选参数都被视为强制参数,即使是使用命名参数调用也是如此。自 PHP 8.0.0 起至 PHP 8.1.0 之前,在定义时会发出弃用通知,但能成功调用。自 PHP 8.1.0 起,会抛出类为 ArgumentCountError 的错误,就跟使用位置参数调用一样。

返回类型与内部类的兼容性 ¶

大多数非 Final 的内部方法现在要求重写方法声明一个可兼容的返回类型,否则在继承时会给出方法废弃的提示。 如果由于 PHP 跨版本兼容性的问题,导致不能为重写方法声明返回类型,则可以添加 ReturnTypeWillChange 注解来取消废弃提示。

Resource 类型迁移为 Object 类型 ¶

一些 资源(resource) 类型已被迁移到 object 类型。 要检查返回值,应该从 is_resource() 检查是否为资源,更改为检查返回值是否等于 false

PHP 8.1.x 废弃的功能 ¶

PHP 核心中废弃的功能 ¶

实现无  __serialize()  和  __unserialize()  的 Serializable 

如果不用兼容 PHP 7.4 以前的版本,就只需要实现新的方法,否则需要同时实现两个方法。

将 null 传递给内置函数的非 null 值参数 ¶

为了与用户定义的函数行为保持一致,标量类型需要被明确标记为允许为 null,内置函数的标量类型默认情况下允许为 null 的行为已被废弃。

<?php var_dump(str_contains("foobar", null)); // Deprecated: Passing null to parameter #2 ($needle) of type string // is deprecated ?>

不兼容从 float 到 int 的隐式转换 ¶

从 float 隐式转换为 int 将会导致精度的丢失,目前这种行为已被废弃。 这将影响到 array 中的键、严格模式下 int 类型的声明以及对 int 的操作。

<?php $a = []; $a[15.5]; // 废弃,作为键值将会丢失 0.5 $a[15.0]; // OK,因为 15.0 == 15 ?>

在 trait 上调用 static 元素 ¶

在 trait 上直接调用 static 方法、直接访问 static 属性的行为已被废弃。静态方法和属性只能在使用了 trait 的类上被访问。

在  __sleep()  中返回非 array 类型值 ¶

在 __sleep() 中返回一个非 array 类型的值现在将会产生一个诊断。

在返回值为 void 的函数中通过引用进行返回 ¶

<?php function &test(): void {} ?>

这种函数是相互矛盾的,在调用时已经发出了 E_NOTICE 提示:Only variable references should be returned by reference

对 false 进行自动代入(Autovivification) ¶

自动代入指的是追加一个值时创建出新 array 的过程。对于标量值而言,自动代入是不被允许的;然而 false 是一个例外。现在这将会被废弃。

<?php $arr = false; $arr[] = 2; // 废弃 ?>

注意:

对 null 或者未定义的值进行自动代入仍然是被允许的:

<?php // 从未定义的值 $arr[] = 'some value'; $arr['doesNotExist'][] = 2; // 从 null $arr = null; $arr[] = 2; ?>

ctype ¶

校验非字符串类型的参数 ¶

传递一个非字符串类型参数的行为已被废弃。在将来,参数将被解释为一个字符串而不是 ASCII 编码。根据可预期的行为,参数需要被转化为 string 或者对 chr() 进行一次显式调用。这会影响所有的 ctype_*() 函数。

Date ¶

在 date_sun_info() 的支持下,date_sunrise() 和 date_sunset() 已被废弃。

strptime() 已被废弃。请使用 date_parse_from_format() (不依赖 locale 的解析)或者 IntlDateFormatter::parse() (依赖 locale 的解析)代替。

strftime() 和 gmstrftime() 已被废弃。请使用date()(不依赖 locale 的格式化)或者 IntlDateFormatter::format() (依赖 locale 的格式化)代替。

Filter ¶

FILTER_SANITIZE_STRING 和 FILTER_SANITIZE_STRIPPED 过滤器已被废弃。

INI 设置项 filter.default 已被废弃

GD ¶

imagepolygon()imageopenpolygon() 和 imagefilledpolygon() 的 num_points 参数已被废弃。

Hash ¶

mhash()、 mhash_keygen_s2k()、 mhash_count()、 mhash_get_block_size()、 mhash_get_hash_name() 已被废弃。 请使用 hash_*() 系列函数代替。

IMAP ¶

NIL 常量已被废弃。请使用 0 代替。

Intl ¶

使用 bool 参数调用 IntlCalendar::roll() 已被废弃。请分别使用 1 和 -1 来代替 true and false

多字节字符串 ¶

无参数调用 mb_check_encoding() 已被废弃。

MySQLi ¶

mysqli_driver::$driver_version 属性已被废弃。它是无意义且过时的,使用 PHP_VERSION_ID 来代替。

使用 mysqli 参数来调用 mysqli::get_client_info() 或 mysqli_get_client_info() 已被废弃。请不带任何参数调用 mysqli_get_client_info() 来获取客户端类库的版本信息。

mysqli::init() 方法已被废弃。使用 parent::__construct()  来代替对 parent::init()  的调用。

OCI8 ¶

INI 设置项 oci8.old_oci_close_semantics 已被废弃。

ODBC ¶

odbc_result_all() 已被废弃。

PDO ¶

PDO::FETCH_SERIALIZE 获取模式已被废弃。

PgSQL ¶

对于所有 pgsql_*() 函数不传递连接参数的方式已被废弃。

SOAP ¶

在 SSL 流上下文参数的代替下, SoapClient::__construct() 的 ssl_method 选项已被废弃。

常规 ¶

对一个对象调用 key()current()、 next()prev()、 reset()end() 已被废弃。对一个对象应优先使用 get_mangled_object_vars(),或使用 ArrayIterator

INI 配置项 auto_detect_line_endings 已被废弃。如有必要,可以手动处理 "\r" 换行符。

FILE_BINARY 和 FILE_TEXT 常量已被废弃。它们从未产生过任何作用。