PHP 7.1 升级至 7.4

公司项目从 7.1 升级到 7.4 故对 php 升级文档进行整理与翻译。

不向下兼容的变更

7.1.x -> 7.2.x

防止 number_format() 返回负零

之前版本中,number_format() 有可能会返回 -0。虽然这是符合 IEEE 754 规范的,但是这样会导致可读性不好,新版本中会将这样的负数去掉。

<?php

var_dump(number_format(-0.01)); // 新版本输出 string(1) "0" 旧版本输出 string(2) "-0"

转换对象和数组中的数字键

将数组转换为对象,或将对象转换为数组时,数字键现在得到了更好的处理(无论是通过显式转换还是通过 settype() 函数)。

这意味着现在可以访问数组中的整数(或者说是字符串整数)键,这些键会映射到对象中:

<?php

// array to object
$arr = [0 => 1];
$obj = (object)$arr;
var_dump(
    $obj,
    $obj->{'0'}, // 新写法
    $obj->{0} // 新写法
);

以上例程会输出:

object(stdClass)#1 (1) {
  ["0"]=>    // string key now, rather than integer key
  int(1)
}
int(1)
int(1)

从对象转换成的数组中的整数(或者说是字符串整数)键现在也可以直接访问:

<?php

// object to array
$obj = new class {
    public function __construct()
    {
        $this->{0} = 1;
    }
};
$arr = (array)$obj;
var_dump(
    $arr,
    $arr[0], // 新写法
    $arr['0'] // 新写法
);

以上例程会输出:

array(1) {
  [0]=>    // integer key now, rather than string key
  int(1)
}
int(1)
int(1)

get_class() 函数不再接受 null 参数

之前版本中,传递 null 给 get_class() 函数将返回当前类名。在新版本中,此行为会抛出一个 E_WARNING 错误。如果想实现与之前版本同样的效果,请不要传递任何参数进来。

计算非可数类型(non-countable)时发出警告

对非可数类型调用 count()(或 sizeof())函数,会抛出一个 E_WARNING 错误。

<?php

var_dump(
    count(null), // NULL is not countable
    count(1), // integers are not countable
    count('abc'), // strings are not countable
    count(new stdclass), // objects not implementing the Countable interface are not countable
    count([1,2]) // arrays are countable
);

以上例程会输出:

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d

Warning: count(): Parameter must be an array or an object that implements Countable in %s on line %d
int(0)
int(1)
int(1)
int(1)
int(2)

ext/hash 从资源变成对象

作为摆脱资源长期迁移的一部分,Hash 扩展已被更新为使用对象而不是资源。对于 PHP 开发者来说,这一变化应该是无缝的,除了is_resource()(需要更新为is_object())。

SSL/TLS 的默认选项的改进

下列默认选项被修改:

  • tls:// 默认为 TLSv1.0 or TLSv1.1 or TLSv1.2
  • ssl:// 成为 tls:// 的别名
  • STREAM_CRYPTO_METHOD_TLS_* 常量默认为 TLSv1.0 或 TLSv1.1 + TLSv1.2,替代之前的 TLSv1.0

gettype() 在闭包资源中的返回值

之前版本中,如果在一个闭包资源中使用 gettype() 会返回字符串 “unknown type”,现在将会返回字符 “resource (closed)"。

is_object() 和 __PHP_Incomplete_Class

之前版本中,对 __PHP_Incomplete_Class 调用 is_object() 函数会返回 false,现在会返回 true。

提升未定义常量的错误级别

调用未定义的常量,现在会抛出一个 E_WARNING 错误(之前版本中为 E_NOTICE)。在下一个 PHP 大版本中,将会抛出一个 Error 错误。

Windows 支持

官方支持的最低 Windows 版本为 Windows 7/Server 2008 R2。

检查 traits 的默认属性值

对默认 traits 属性值的兼容性检查将不再执行强制转换。

object 保留字的变化

object 在之前的 PHP 7.0 版本 中被声明为软保留字(soft-reserved)。现在变更为强制保留字,禁止在任何类或接口中使用该名称。

NetWare 支持

NetWare 已不再被支持。

具有SORT_STRING 的 array_unique()

虽然先前使用 SORT_STRING 的 array_unique() 复制了数组并删除了非唯一元素(此后不打包数组),但现在通过添加唯一元素来构建新数组。 这可能会导致不同的数字索引。

bcmod() 浮动数的变化

bcmod() 函数不再将小数截断为整数。 因此,它的行为现在遵循fmod()方法,而不是 % 运算符。 例如 bcmod(‘4’,‘3.5’)现在返回0.5而不是1。

哈希函数和非加密哈希值

hash_hmac()、hash_hmac_file()、hash_pbkdf2()和hash_init()(带HASH_HMAC)函数不再接受非加密的哈希值。

json_decode() 函数变更

json_decode()函数选项JSON_OBJECT_AS_ARRAY现在在第二个参数(assoc)为 null 时作为默认参数。以前,JSON_OBJECT_AS_ARRAY总是被忽略。

rand() 和 mt_rand() 输出

由 rand() 和 mt_rand() 作为特定种子生成的序列可能与64位计算机上的 PHP7.1 不同(由于修复了实现中的一个模数偏差错误)。

sql.safe_mode ini 选项移除

sql.safe_mode ini 设置项已被移除。

对 date_parse() 和 date_parse_from_format() 的更改

date_parse() 和 date_parse_from_format() 返回的数组中的zone元素现在代表秒而不是分钟,其符号也被颠倒了。例如,-120现在是7200。

接收到的 Cookies

从 PHP 7.2.34 开始,为了安全起见,接受到的 Cookie 中的 names 参数不再被 URL 编码。

7.2.x -> 7.3.x

Heredoc / Nowdoc 结尾标签解释

由于引入了灵活的 heredoc / nowdoc 语法,因此在正文中包含结尾标签的doc字符串可能会导致语法错误或解释更改。 例如在:

<?php
$str = <<<FOO
abcdefg
   FOO
FOO;
?>

缩进的 FOO 以前没有任何特殊含义。现在它将被解释为 heredoc 字符串的结尾,后面的 FOO; 将导致语法错误。这个问题可以通过选择一个不在字符串内容中出现的结束标签来解决。

Switch 结构中 Continue 问题的警告

针对 switch 控制流结构中的 continue 语句现在会产生一个警告。在 PHP 中,这种 continue 语句等同于 break,而在其他语言中则表现为 continue 2。

<?php
while ($foo) {
    switch ($bar) {
      case "baz":
         continue;
         // Warning: "continue" targeting switch is equivalent to
         //          "break". Did you mean to use "continue 2"?
   }
}
?>

严格解释 ArrayAccess 上的整数字符串键

对 $obj[“123”] 类型的数组访问,其中$obj实现了 ArrayAccess 并且 “123” 是整数字符串文本,这将不再进行隐式转换为整数,即 $obj->offsetGet(“123”) 将不能通过 $obj->offsetGet(123) 调用。 对于 non-literals 这符合现有行为。 数组的行为不会受到任何影响,它们会继续将整数字符串键隐式转换为整数。

静态属性不再由引用赋值来分隔

在PHP中,静态属性在继承的类之间共享,除非在子类中显式覆盖了静态属性。 但是,由于存在实施构件(implementation artifact),因此可以通过分配引用来分离静态属性。 此漏洞已得到修复。

<?php
class Test {
    public static $x = 0;
}
class Test2 extends Test { }

Test2::$x = &$x;
$x = 1;

var_dump(Test::$x, Test2::$x);
// Previously: int(0), int(1)
// Now:        int(1), int(1)
?>

数组和属性访问返回的引用将立即展开

现在,将数组和属性访问返回的引用展开为访问的一部分。 这意味着不再可能在访问和使用访问值之间修改引用:

<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Previously: int(4), Now: int(3)
?>

这使引用和非引用的行为保持一致。请注意,读取和写入单个表达式中的一个值仍然是未定义行为,并可能在未来再次改变。

不再支持具有非整数键的遍历器的参数解包

对于非整数键的遍历器,参数解包停止工作。以下代码在PHP 5.6-7.2中意外地工作。

<?php
function foo(...$args) {
    var_dump($args);
}
function gen() {
    yield 1.23 => 123;
}
foo(...gen());
?>

杂项

ext_skel工具已经被完全重新设计,增加了新的选项并删除了一些旧的选项。现在它是用PHP编写的,没有任何外部依赖性。

对 BeOS 的支持已经被放弃。

由于在 EH_THROW 模式下将警告自动转换为异常而抛出的异常(例如一些DateTime异常)不再填充 error_get_last() 状态。因此,它们现在与手动抛出的异常的工作方式相同。

TypeError 现在将错误的类型分别报告为 int 和 bool,而不是integer 和 boolean。

传递给 compact() 的未定义变量现在将被报告为 notice。

getimagesize() 和相关函数现在将 BMP 图像的 mime 类型报告为 image/bmp,而不是image/x-ms-bmp,因为前者已经在 IANA注册(参见 RFC 7903)。

stream_socket_get_name() 现在将返回括在方括号中的IPv6地址。例如,将返回“[::1]:1337”而不是“::1:1337”。

BCMath 任意数学精度

由 BCMath 函数抛出的所有警告现在都使用了PHP 的错误处理。以前有些警告会直接写到 stderr。

bcmul()和 bcpow()现在以所要求的比例返回数字。以前,返回的数字可能遗漏了小数点后的零。

IMAP、POP3和NNTP

rsh/ssh登录默认是禁用的。如果你想启用它们,请使用 imap.enable_insecure_rsh。请注意,IMAP库在将邮箱名称传递给rsh/ssh命令之前不会对其进行过滤,因此在启用rsh/ssh的情况下将不受信任的数据传递给这个函数是不安全的。

多字节字符串

由于增加了对命名捕获的支持,使用命名捕获的 mb_ereg_*() 模式的行为将有所不同。特别是命名捕获将成为匹配的一部分,并且 mb_ereg_replace() 将解释额外的语法。更多信息,请参见命名捕获(Named Captures)。

MySQL改进后的扩展

预备语句现在可以正确地报告DATETIME、TIME和TIMESTAMP列的小数秒数(例如,当使用微秒时,TIMESTAMP(6))。以前,小数秒部分只是在返回值中被省略。

MySQL函数 (PDO_MYSQL)

预备语句现在可以正确地报告DATETIME、TIME和TIMESTAMP列的小数秒数(例如,当使用微秒时,TIMESTAMP(6))。以前,小数秒部分只是从返回值中省略。请注意,这只影响到PDO_MYSQL在关闭模拟准备时的使用(例如,使用本地准备功能)。使用具有PDO::ATTR_EMULATE_PREPARES=true(这是默认的)的连接的语句不受错误修复的影响,并且已经从引擎中获得了正确的小数秒值。

反射

反射导出到字符串现在分别使用 int 和 bool 而不是 integer 和 boolean。

标准PHP库(SPL)

如果SPL自动加载器抛出一个异常,后面的自动加载器将不会被执行。以前,所有的自动加载器都被执行,而异常是连锁的。

SimpleXML

现在,涉及 SimpleXML 对象的数学运算会将文本视为 int 或 float,以两者中较合适的一个为准。 以前,将值无条件地视为整数。

接收到的 Cookies

从 PHP 7.2.34 开始,为了安全起见,接受到的 Cookie 中的 names 参数不再被 URL 编码。

7.3.x -> 7.4.x

以数组形式访问非数组

尝试以数组方式访问 null,bool, int,float 或 resource (例如 $null["key"])将会抛出 notice 通知。

get_declared_classes() 函数

get_declared_classes() 函数将不再返回匿名的类,假如它们没有被实例化的话。

fn 关键词

fn 成为了保留关键词。需要特别注意,它不能再做为函数名或类名使用,但是仍然可以做为方法名和常量名存在。

文件尾部的 <?php 标签

文件尾部的 <?php 标签(不包含空行)将会被解释成一个 PHP 头标签。以前,它被解释为一个短的开始标记,后跟原义php,并导致语法错误(short_open_tag = 1),或者被解释为原义<?php字符串(其中short_open_tag = 0)。

Stream wrappers

当在流上使用include/require时,streamWrapper::stream_set_option()将在调用STREAM_OPTION_READ_BUFFER选项时被调用。自定义流包装器的实现可能需要实现streamWrapper::stream_set_option()方法以避免警告(始终返回false即可实现)。

Serialization 序列化

序列化类型 o 被移除。因为它不是由 PHP 生成的,这可能会影响到之前项目中手动生成的序列化字符串。

密码算法常量

密码哈希算法标识符现在是可空字符串,而不再是整数。

  • PASSWORD_DEFAULT 之前是 int 1; 现在是 null
  • PASSWORD_BCRYPT 之前是 int 1; 现在是 string ‘2y’
  • PASSWORD_ARGON2I 之前是 int 2; 现在是 string ‘argon2i’
  • PASSWORD_ARGON2ID 之前是 int 3; 现在是 string ‘argon2id’

应用中如果正常使用了常量 PASSWORD_DEFAULT,PASSWORD_BCRYPT,PASSWORD_ARGON2I 和 PASSWORD_ARGON2ID 将不会受到影响。

htmlentities() 函数

如果htmlentities()被用于只支持基本实体替换的编码,它现在会引发一个通知(而不是严格的标准警告),在这种情况下,它等同于htmlspecialchars()。

fread() and fwrite() 函数

fread() 和 fwrite() 在操作失败的时候会返回 false。之前的版本中会返回空字符串或 0。EAGAIN/EWOULDBLOCK 不视为故障。

这些函数现在也会在失败时发出 NOTICE 通知,例如当试图写入一个只读文件资源时。

BCMath 任意数学精度

BCMath函数现在会在传递非格式化的数字时发出警告,例如 “32foo”。该参数将被解释为零,和以前一样。

CURL

现在尝试序列化CURLFile类将生成一个异常。 以前,该异常仅在未序列化时抛出。

不建议使用CURLPIPE_HTTP1,从cURL 7.62.0开始不再支持。

不推荐使用curl_version()的$ version参数。 如果传递了不等于默认CURLVERSION_NOW的任何值,则会引发警告并忽略该参数。

Date 和 Time

在DateTime或DateTimeImmutable实例上调用var_dump()或类似的方法,将不再留下该对象的可访问属性。

DateInterval 对象的比较(使用 ==, < 等)现在将产生一个警告,并且总是返回 false。以前,所有的DateInterval对象都被认为是相等的,除非它们有属性。

Intl

idn_to_ascii() 和 idn_to_utf8() 的默认参数值现在是 INTL_IDNA_VARIANT_UTS46,而不是被废弃的 INTL_IDNA_VARIANT_2003。

MySQLi

嵌入式服务器功能已被删除。 至少从PHP 7.0起就被破坏了。

取而代之的是mysqli::stat(),删除了未公开的mysqli::$stat属性。

OpenSSL

现在,openssl_random_pseudo_bytes()函数将在错误情况下引发异常,类似于random_bytes()。 特别是,如果请求的字节数小于或等于零,则引发Error;如果无法收集足够的随机性,则引发Exception。 如果函数不抛出,则保证$crypto_strong输出参数始终为true,因此无需进行显式检查。

正则表达式(与Perl兼容)

使用PREG_UNMATCHED_AS_NULL模式时,尾部未匹配的捕获组现在也将被设置为 null(如果启用了偏移捕获,则为[null,-1])。 这意味着$matches的大小将始终相同。

PHP Data Objects

试图序列化一个PDO或PDOStatement实例现在将产生一个异常,而不是PDOException,这与其他不支持序列化的内部类一致。

反射

如果试图对反射对象进行序列化,现在会产生一个异常。反射对象的序列化从来没有被支持过,并且会导致反射对象的损坏。现在它已被明确禁止。

标准PHP库(SPL)

在 ArrayObject 实例上调用 get_object_vars() 现在将总是返回 ArrayObject 本身(或一个子类)的属性。以前,除非指定 ArrayObject::STD_PROP_LIST 标志,否则它会返回被包装的数组/对象的值。

其他受影响的操作是:

ReflectionObject::getProperties() reset(), current(), 等等。使用Iterator方法代替。 潜在的其他工作对象属性为一个列表。

(array)的转换不受影响。 它们将继续返回包装的数组或ArrayObject属性,具体取决于是否使用ArrayObject::STD_PROP_LIST标志。

如果传递零,则SplPriorityQueue::setExtractFlags()将引发异常。 以前,这将在下一次提取操作中产生可恢复的致命错误。

现在,除了Serializable接口之外,ArrayObject,ArrayIterator,SplDoublyLinkedList和SplObjectStorage还支持__serialize()和__unserialize()机制。 这意味着在较旧的PHP版本上创建的序列化有效负载仍然可以反序列化,但是较旧的版本将无法理解由PHP 7.4创建的新有效负载。

Tokenizer

token_get_all() 现在将为意外字符发出T_BAD_CHARACTER令牌,而不是在令牌流中留下漏洞。

接收到的 Cookies

从 PHP 7.4.11 开始,为了安全考虑,接受到的 Cookie 中的 names 参数不再被 URL 编码。

废弃的功能

7.1.x -> 7.2.x

不带引号的字符串

不带引号的字符串是不存在的全局常量,转化成他们自身的字符串。 在以前,该行为会产生 E_NOTICE,但现在会产生 E_WARNING。在下一个 PHP 主版本中,将抛出 Error 异常。

<?php

var_dump(NONEXISTENT);

/* Output:
Warning: Use of undefined constant NONEXISTENT - assumed 'NONEXISTENT' (this will throw an Error in a future version of PHP) in %s on line %d
string(11) "NONEXISTENT"
*/

png2wbmp() 和 jpeg2wbmp()

GD 扩展内的 png2wbmp() 和 jpeg2wbmp() 现已被废弃,将在下一个 PHP 主版本中移除。

INTL_IDNA_VARIANT_2003 转化

Intl 扩展废弃了 INTL_IDNA_VARIANT_2003 转化,为idn_to_ascii() 和 idn_to_utf8() 的默认选项。 PHP 7.4 会把默认值设置为 INTL_IDNA_VARIANT_UTS46, 并在下一个 PHP 主版本中完全移除 INTL_IDNA_VARIANT_2003

__autoload() 方法

__autoload() 方法已被废弃, 因为和 spl_autoload_register() 相比功能较差 (因为无法链式处理多个 autoloader), 而且也无法在两种 autoloading 样式中配合使用。

track_errors ini 设置和 $php_errormsg 变量

当开启了 track_errors ini 设置,出现非致命错误时, 会在本地作用域创建 $php_errormsg 变量。 由于提供了更好的方式: error_get_last() 来获取此类错误信息,该功能被废弃。

create_function() 函数

考虑到此函数的安全隐患问题(它是 eval() 的瘦包装器),该过时的函数现在已被废弃。 更好的选择是匿名函数。

mbstring.func_overload ini 设置

由于此设置会影响环境中的字符串系列函数,带来相互操作中的问题,它现在已被废弃。

(unset) 类型强制转化

转化任意表达式为此类型,结果总是 null,所以这个多余的类型转化现在也就被废弃了。

parse_str() 不加第二个参数

使用 parse_str() 时,不加第二个参数会导致查询字符串参数导入当前符号表。 考虑到安全隐患问题,不加第二个参数使用 parse_str() 的行为已被废弃。 此函数的第二个选项为必填项,它使查询字符串转为 Array。

gmp_random() 函数

此函数基于未知的、取决于平台的 limb 尺寸产生随机数。因此,该函数已被废弃。 使用更好的方式产生随机数: GMP 扩展中的 gmp_random_bits() 和 gmp_random_range()。

each() 函数

使用此函数遍历时,比普通的 foreach 更慢, 并且给新语法的变化带来实现问题。因此它被废弃了。

assert() 一个字符串参数

assert() 字符串参数将要求它能被 eval() 执行。 考虑到可能被执行远程代码,废弃了字符串的 assert(),最好提供 bool 的表达式。

错误处理器内的 $errcontext 参数

$errcontext 参数包含了错误网站的所有本地变量。 考虑到它很少被用到,而且还会导致内部优化问题,它现在被废弃了。 代替用法:调试器应该自己取回错误站点的本地变量。

read_exif_data() 函数

read_exif_data() 别名已被废弃 使用 exif_read_data() 函数代替。

7.2.x -> 7.3.x

大小写不敏感的常量

大小写不敏感的常量声明现已被废弃。将 true 作为第三个参数传递给 define() 将会导致一个废弃警告。大小写不敏感的使用(在读取时使用一个与声明时不同的大小写方式)也已被废弃。

命名空间中的 assert()

废弃:在一个命名空间中声明一个名为 assert() 的函数。 assert() 函数属于引擎特殊处理的情况,当在命名空间中使用相同名字去定义 函数时也许会导致不一致的行为。

在字符串中搜索非字符串内容

废弃:将一个非字符串内容传递给字符串搜索函数。 在将来所有待搜索的内容都将被视为字符串,而不是 ASCII 编码值。如果需要依赖这个特性,你应该 要么显示地进行类型转换(转为字符串),或者显示地调用 chr()。 以下是受到影响的方法:

  • strpos()
  • strrpos()
  • stripos()
  • strripos()
  • strstr()
  • strchr()
  • strrchr()
  • stristr()

Strip-Tags Streaming

fgetss() 函数和 string.strip_tags stream filter 已经被废弃。这同样影响了 SplFileObject::fgetss() 方法和 gzgetss() 函数。

Data Filtering

对于 FILTER_FLAG_SCHEME_REQUIRED 和 FILTER_FLAG_HOST_REQUIRED 常量的显示使用已被废弃。 总之,FILTER_VALIDATE_URL 已经隐含了这两者。

图像处理和 GD 库

image2wbmp() 已被废弃。

国际化相关函数

如果 PHP 关联的ICU ≥ 56, 那么 Normalizer::NONE 形式的使用将会导致抛出一个废弃警告。

多字节字符串

以下在文档中不存在的 mbereg_() 别名已被废弃。请使用相应的 mb_ereg_() 变体替代。

  • mbregex_encoding()
  • mbereg()
  • mberegi()
  • mbereg_replace()
  • mberegi_replace()
  • mbsplit()
  • mbereg_match()
  • mbereg_search()
  • mbereg_search_pos()
  • mbereg_search_regs()
  • mbereg_search_init()
  • mbereg_search_getregs()
  • mbereg_search_getpos()
  • mbereg_search_setpos()

ODBC 和 DB2 函数 (PDO_ODBC)

pdo_odbc.db2_instance_name ini 设置项在先前已被废弃。 它在文档中自 PHP 5.1.1 起被废弃

7.3.x -> 7.4.x

没有显式括号的嵌套三元运算符

嵌套的三元操作中,必须明确使用显式括号来决定操作的顺序。以前,如果不使用括号,在大多数情况下,左关联性不会导致预期的行为。

<?php
1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
?>

大括号访问数组和字符串索引

使用大括号访问数组及字符串索引的方式已被废弃。请使用 $var[$idx] 的语法来替代 $var{$idx}。

(real) 类型和 is_real() 函数

(real) 类型已被废弃,请使用 (float) 来替代。

同时被废弃的还有 is_real() 函数,请使用 is_float() 来替代。

当$this被使用时,解除对$this的绑定

不建议使用$this的非静态闭包解除$this的绑定。

parent 关键词在没父类的类中使用

在没有父类的类中使用 parent 关键词已被废弃,并且在将来的 PHP 版本中将会抛出一个编译错误。目前只在运行时访问父类时才会产生错误。

allow_url_include INI 选项

配置文件中的 allow_url_include 选项被废弃。如果启用了该选项,将会产生一个弃用通知。

基础转换函数中的无效字符处理

在下面这些基础转换函数中,base_convert(), bindec(), octdec() 和 hexdec() 如果传入了非法字符,将会抛出一个弃用通知。函数会忽略掉无效字符后正常返回结果。前导空格和尾部空格,以及类型为 0x (取决于基数) 被允许传入。

在对象中使用 array_key_exists()

在一个对象中使用 array_key_exists() 已被废弃。请使用 isset() 或 property_exists() 来替代。

魔术引号函数

魔术引号函数 get_magic_quotes_gpc() 和 get_magic_quotes_runtime() 已被废弃。它们将永远返回 false。

hebrevc() 函数

hebrevc() 函数已被废弃。 可以用 nl2br(hebrev($str)) 来替代,更好的方法是启用 Unicode RTL 来支持。

convert_cyr_string() 函数

convert_cyr_string() 函数已被废弃。可以用 mb_convert_string(), iconv() 或 UConverter 替代。

money_format() 函数

money_format() 函数已被废弃。 可以用更国际化的 NumberFormatter 功能来替代。

ezmlm_hash() 函数

ezmlm_hash() 函数已被废弃。

restore_include_path() 函数

restore_include_path() 函数已被废弃。可以用 ini_restore(‘include_path’) 替代。

Implode 函数的参数顺序

implode() 允许反转参数顺序的特性已被废弃,请使用 implode($glue, $parts) 来替代 implode($parts, $glue)。

COM

导入类型库的大小写不敏感的常量注册已被废弃。

Filter

FILTER_SANITIZE_MAGIC_QUOTES 已被废弃,使用 FILTER_SANITIZE_ADD_SLASHES 来替代。

多字节字符串

向 mb_ereg_replace() 传递非字符串模式已被废弃。目前,非字符串模式被解释为 ASCII 代码点。在 PHP 8 中,模式将被解释为一个字符串。

将编码作为第三参数传递给 mb_strrpos() 已被废弃。取而代之的是传递一个 0 偏移量,并将编码作为第四个参数。

Lightweight Directory Access Protocol

ldap_control_paged_result_response() 和 ldap_control_paged_result() 函数已被废弃。控制页面操作可以使用 ldap_search() 替代。

反射

调用 ReflectionType::__toString() 现在将会抛出一个弃用通知。 该方法从 PHP 7.1 开始,在 ReflectionNamedType::getName() 的文档中已经被声明废弃,但是由于技术原因,并没有抛出弃用通知。

所有Reflection类的export()方法已被废弃。构建一个Reflection对象并将其转换为字符串。

<?php
// ReflectionClass::export(Foo::class, false) is:
echo new ReflectionClass(Foo::class), "\n";

// $str = ReflectionClass::export(Foo::class, true) is:
$str = (string) new ReflectionClass(Foo::class);
?>

Socket

常量 AI_IDN_ALLOW_UNASSIGNED 和 AI_IDN_USE_STD3_ASCII_RULES 在 socket_addrinfo_lookup() 中不再可用,因为该常量在 glibc 中已被废弃。