由于每个新版本都会添加一些新功能,因此某些功能也会被删除,因为它们被视为已过时。在本章中,我们将了解 PHP 版本 5 之后已弃用的功能。
PHP 版本 7 中已弃用
PHP 4 样式构造函数
PHP 4 风格的构造函数是与定义它们的类同名的方法,现在已经被弃用,将来会被删除。如果 PHP 4 构造函数是类中定义的唯一构造函数,PHP 7 将发出 E_DEPRECATED。实现 __construct() 方法的类不受影响。
请看下面的例子 -
<?php
class A {
function A() {
print('Style Constructor');
}
}
?>
它在浏览器上生成以下输出 -
constructors in a future version of PHP; A has a deprecated constructor in...
对非静态方法的静态调用
对非静态方法的静态调用已弃用,将来可能会删除。
请看下面的例子 -
<?php
class A {
function b() {
print('Non-static call');
}
}
A::b();
?>
在浏览器上生成以下输出 -
Non-static call
password_hash() salt 选项
password_hash() 函数的 salt 选项已被弃用,因此开发人员不会生成自己的(通常是不安全的)salt 。当开发人员未提供 salt 时,该函数本身会生成加密安全的 salt,因此不再需要自定义 salt 生成。
capture_session_meta SSL 上下文选项
capture_session_meta SSL 上下文选项已弃用。SSL 元数据现在通过 stream_get_meta_data() 函数使用。
ext/mcrypt
mcrypt 扩展已被弃用,取而代之的是 OpenSSL。
未加引号的字符串
作为不存在的全局常量的未加引号的字符串被视为自身的字符串。此行为过去用于发出 E_NOTICE,但现在将发出 E_WARNING。在 PHP 的下一个主要版本中,将引发 Error 异常。
__autoload() 方法
__autoload() 方法已被弃用,因为它不如 spl_autoload_register() (因为它无法链接自动加载器),并且两种自动加载样式之间没有互操作性。
create_function() 函数
鉴于此函数的安全问题,现已弃用。首选的替代方法是使用匿名函数。
each() 函数
此函数会导致某些语言更改的实现问题。因此,它已被弃用。
不区分大小写的常量
不区分大小写的常量声明已弃用。现在,将 true 作为第三个参数传递给 define() 将生成弃用警告。
(real) 和 is-real() 函数
(real) cast 已弃用,请改用 (float)。is_real() 函数也被弃用,请改用 is_float()。
“父级”Leyword
在没有父级的类中使用父级已被弃用,并且将来会引发编译时错误。目前,只有在运行时访问父级时,才会生成错误。
PHP 版本 8 中已弃用
如果具有默认值的参数后跟必需参数,则默认值无效。从 PHP 8.0.0 开始,这个问题已经被废弃了,通常可以通过删除默认值来解决,而功能没有变化 -
<?php
function test($a = [], $b) {} // 之前
function test($a, $b) {} // 之后
?>
此规则的一个例外是 Type $param = null 形式的参数,其中 null 默认值使类型隐式可为空。这种用法仍然是允许的,但建议使用显式可为 null 的类型 -
<?php
function test(A $a = null, $b) {} // 仍然允许
function test(?A $a, $b) {} // 建议
?>
在 exclude_disabled 显式设置为 false 的情况下调用 get_defined_functions() 已被弃用,不再有效。get_defined_functions() 永远不会包含禁用的函数。
返回 true 或 false 的排序比较函数现在将引发弃用警告,并且应替换为返回小于、等于或大于零的整数的实现。
<?php
// 更换
usort($array, fn($a, $b) => $a > $b);
// 具有
usort($array, fn($a, $b) => $a <=> $b);
?>
隐式 Incompatible float 到 int 转换
导致精度损失的 float 到 int 的隐式转换现已弃用。这会影响数组键、强制模式下的 int 类型声明以及处理 int 的运算符。
对 trait 调用 Static 元素
调用 static 方法或直接在 trait 上访问 static 属性已被弃用。静态方法和属性只能在使用 trait 的类上访问。
日期函数
date_sunrise() 和 date_sunset() 已弃用。请改用 date_sun_info()。
strptime() 已被弃用。请改用 date_parse_from_format() (用于与区域设置无关的解析)或 IntlDateFormatter::p arse() (用于与区域设置相关的解析)。
strftime() 和 gmstrftime() 已弃用。您可以改用 date() (用于与区域设置无关的格式),或 IntlDateFormatter::format() (用于与区域设置相关的格式)。
动态属性
动态属性的创建已弃用。请改用允许动态属性的 stdClass。