Php 简明教程

PHP – Deprecated Features

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

Deprecated in PHP Ver 7

PHP 4 Style Constructors

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

Example

请看以下示例:

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

它在浏览器中生成以下 output

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...

Static Calls to Non-static Methods

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

Example

请看以下示例:

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

它在浏览器中生成以下 output

Deprecated: Non-static method A::b() should not be called statically in...
Non-static call

password_hash() salt option

password_hash() 函数的 salt 选项已弃用,以便开发人员不会生成他们自己的(通常不安全的)salt。当开发人员不提供 salt 时,函数本身会生成一个加密安全的 salt - 因此不再需要自定义 salt 生成了。

capture_session_meta SSL context option

capture_session_meta SSL 上下文选项已弃用。SSL 元数据现在通过 stream_get_meta_data() 函数使用。

ext/mcrypt

mcrypt 扩展已弃用,取而代之的是 OpenSSL。

Unquoted Strings

不存在全局常量的未引用的字符串将被视为它们自身的字符串。此行为过去会发出 E_NOTICE,但现在会发出 E_WARNING。在下一个 PHP 主要版本中,将转而引发 Error 异常。

The __autoload() Method

__autoload() 函数已弃用,因为它不如 spl_autoload_register() (因为它无法链接自动加载器),并且这两种自动加载样式之间没有互操作性。

The create_function() Function

鉴于此函数存在安全问题,现在已弃用。首选的替代方法是使用匿名函数。

The each() Function

此函数会给一些语言更改带来实现问题。因此已将其弃用。

Case-Insensitive Constants

声明不区分大小写的常数已被弃用。现在传递 true 作为 define() 的第三个参数将生成弃用警告。

The (real) and is-real() Function

(真实)转换已被弃用,请改为使用(浮点)。is_real() 函数也被弃用,请改为使用 is_float()。

The "parent" Leyword

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

Deprecated in PHP Ver 8

如果具有默认值的参数后面跟随一个必需参数,则默认值无效。自 PHP 8.0.0 起,则此操作已被弃用,并且通常可以通过删除默认值来解决,而无需更改功能 −

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

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

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

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

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

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

Implicit Incompatible float to int Conversions

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

Calling a Static Element on a Trait

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

Date Functions

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

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

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

Dynamic Properties

创建动态属性已弃用。相反,请使用允许动态属性的 stdClass。