8.1 更新内容
新特性 ¶
PHP 核心 ¶
八进制整数文字表达前缀 ¶
类似于二进制和十六进制字面量表达方式,现在八进制整数可以在表示中使用更为清晰地前缀 0o/0O 。
<?php 014; // 无前缀的八进制表示 0o14; // 添加前缀的八进制表示 ?>
支持字符串类型键的数组解包 ¶
新增字符串类型键的数组解包。
<?php $arr1 = [1, 'a' => 'b']; $arr2 = [...$arr1, 'c' => 'd']; //[1, 'a' => 'b', 'c' => 'd'] ?>
参数展开后命名参数 ¶
现在可以在参数展开后为命名参数。 例如: foo(...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 常量已被废弃。它们从未产生过任何作用。