PHP – 已弃用功能



随着每个新版本的发布,都会添加一些新功能,同时也会删除一些被认为已过时的功能。在本章中,我们将了解 PHP 5 版本之后弃用的功能。

PHP 7 中弃用

PHP 4 样式构造函数

PHP 4 样式构造函数是指方法名称与定义它们的类名称相同,现在已弃用,将来将被移除。如果 PHP 4 构造函数是类中定义的唯一构造函数,则 PHP 7 将发出 E_DEPRECATED。实现 __construct() 方法的类不受影响。

示例

请查看以下示例 -

<?php
   class A {
      function A() {
         print('Style Constructor');
      }
   }
?>

它在浏览器上产生以下输出 -

Deprecated: Methods with the same name as their class will not be 
constructors in a future version of PHP; A has a deprecated constructor in...

对非静态方法的静态调用

对非静态方法的静态调用已弃用,将来可能会被移除。

示例

请查看以下示例 -

<?php
   class A {
      function b() {
         print('Non-static call');
      }
   }
   A::b();
?>

它在浏览器上产生以下输出 -

Deprecated: Non-static method A::b() should not be called statically in...
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) 转换已弃用,请改用 (float)。is_real() 函数也已弃用,请改用 is_float()。

"parent" 关键字

在没有父类的类中使用 parent 已弃用,将来会抛出编译时错误。目前,只有在运行时访问父类时才会生成错误。

PHP 8 中弃用

如果带有默认值的参数后跟必需参数,则默认值无效。从 PHP 8.0.0 开始,这已弃用,通常可以通过删除默认值来解决,而不会更改功能 -

<?php
   function test($a = [], $b) {}  // Before
   function test($a, $b) {}      // After
?>

此规则的一个例外是表单 Type $param = null 的参数,其中 null 默认值使类型隐式可为空。此用法仍然允许,但建议改用显式可为空的类型 -

<?php
   function test(A $a = null, $b) {} 	// Still allowed
   function test(?A $a, $b) {}         // Recommended
?>

调用 get_defined_functions() 并将 exclude_disabled 显式设置为 false 已弃用,并且不再有任何作用。get_defined_functions() 永远不会包含禁用的函数。

返回 true 或 false 的排序比较函数现在将抛出弃用警告,应替换为返回小于、等于或大于零的整数的实现。

<?php
   // Replace
   usort($array, fn($a, $b) => $a > $b);
   // With
   usort($array, fn($a, $b) => $a <=> $b);
?>

隐式不兼容的 float 到 int 转换

现在已弃用导致精度损失的 float 到 int 的隐式转换。这会影响数组键、强制模式下的 int 类型声明以及对 int 进行运算的运算符。

在特性上调用静态元素

在特性上直接调用静态方法或访问静态属性已弃用。静态方法和属性只能在使用特性的类上访问。

日期函数

date_sunrise() 和 date_sunset() 已弃用。请改用 date_sun_info()。

strptime() 已弃用。请改用 date_parse_from_format()(用于与区域设置无关的解析)或 IntlDateFormatter::parse()(用于与区域设置相关的解析)。

strftime() 和 gmstrftime() 已弃用。您可以改用 date()(用于与区域设置无关的格式化)或 IntlDateFormatter::format()(用于与区域设置相关的格式化)。

动态属性

动态属性的创建已弃用。请改用允许动态属性的 stdClass。

广告