弃用功能
PHP 核心
用户输出处理程序变更
已弃用在用户输出处理程序中尝试生成输出(例如使用 echo)。该弃用警告会绕过当前处理程序直接输出,以确保警告可见;若存在嵌套的输出处理程序,则会继续使用下一个处理程序。
非标准的类型转换名称
已弃用非标准的类型转换名称 (boolean)、(integer)、(double)
和 (binary),应分别改用 (bool)、(int)、(float)
和 (string)。
使用分号终止 case 语句
已弃用在 case 语句末尾使用分号而非冒号作为终止符的做法。
反引号运算符
已弃用将反引号运算符作为 shell_exec() 的别名。
从 __debugInfo() 返回 null
已弃用从 __debugInfo() 返回 null,应改用返回空数组。
report_memleaks INI 指令
已弃用 report_memleaks INI 指令。
常量重复声明
已弃用常量的重复声明。需要注意的是,此操作此前已会触发警告,今后仍将继续如此。
闭包绑定问题
以下闭包绑定问题此前已触发 E_WARNING,现已标记为废弃:
- 将实例绑定到静态闭包。
- 将方法绑定到不是该方法所属类(或其子类)的实例对象上。
- 从方法中解绑 $this。
- 从使用了 `$this` 的闭包中解绑 $this。
- 将闭包绑定到内部类的作用域。
- 重新绑定从函数或方法创建的闭包的作用域。
__sleep() 和 __wakeup() 魔术方法
已软废弃 __sleep() 和 __wakeup() 魔术方法,建议改用 __serialize() 和 __unserialize() 魔术方法;若需兼容 PHP 7,可同时使用这两组方法。
使用 null 作为数组偏移量
将 null 用作数组偏移量或在调用 array_key_exists() 时使用 null 现已废弃,应改用空字符串。
递增非数字字符串
对非数字字符串进行递增操作现已废弃,应改用 str_increment() 函数。
register_argc_argv INI directive
对于非 CLI SAPI,从查询字符串中推导 $_SERVER['argc'] 和 $_SERVER['argv'] 的做法现已废弃。应配置
register_argc_argv=0,并在确认使用安全的前提下,改用 $_GET 或
$_SERVER['QUERY_STRING'] 来获取相关信息。
cURL
已废弃 curl_close() 函数,因为 CurlHandle 对象会自动释放。
已废弃 curl_share_close() 函数,因为 CurlShareHandle 对象会自动释放。
Date
已废弃 DATE_RFC7231 和 DateTimeInterface::RFC7231
常量,因为会忽略其关联的时区,始终使用 GMT。
GD
已废弃 imagedestroy() 函数,因为 GdImage 对象会自动释放。
Hash
已废弃 MHASH_* 常量。
Intl
已废弃 intl.error_level INI 配置项。应手动检查错误,或通过启用 intl.use_exceptions INI 配置项来使用异常处理。
LDAP
已废弃部分 Oracle Instant Client 调用和常量。受影响的调用列表: 受影响的调用列表:
- ldap_connect() with wallet support
- ldap_connect_wallet()
GSLC_SSL_NO_UATHGSLC_SSL_ONEWAY_UATHGSLC_SSL_TWOWAY_UATH
MySQLi
已废弃 mysqli_execute() 别名函数,应改用 mysqli_stmt_execute()。
OpenSSL
已废弃 openssl_pkey_derive() 的 $key_length 参数,因为要么忽略该参数,要么会截断密钥,可能引发安全漏洞。
PDO
由于来自远程 URI 的 DSN 存在安全风险,已废弃 "uri:" DSN 方案。
已废弃 PDO 类中的驱动专属常量。受影响的常量及其替代项如下:
PDO::DBLIB_ATTR_CONNECTION_TIMEOUT=>Pdo\Dblib::ATTR_CONNECTION_TIMEOUTPDO::DBLIB_ATTR_QUERY_TIMEOUT=>Pdo\Dblib::ATTR_QUERY_TIMEOUTPDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER=>Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIERPDO::DBLIB_ATTR_VERSION=>Pdo\Dblib::ATTR_VERSIONPDO::DBLIB_ATTR_TDS_VERSION=>Pdo\Dblib::ATTR_TDS_VERSIONPDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS=>Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETSPDO::DBLIB_ATTR_DATETIME_CONVERT=>Pdo\Dblib::ATTR_DATETIME_CONVERTPDO::FB_ATTR_DATE_FORMAT=>Pdo\Firebird::ATTR_DATE_FORMATPDO::FB_ATTR_TIME_FORMAT=>Pdo\Firebird::ATTR_TIME_FORMATPDO::FB_ATTR_TIMESTAMP_FORMAT=>Pdo\Firebird::ATTR_TIMESTAMP_FORMATPDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>Pdo\Mysql::ATTR_USE_BUFFERED_QUERYPDO::MYSQL_ATTR_LOCAL_INFILE=>Pdo\Mysql::ATTR_LOCAL_INFILEPDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY=>Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORYPDO::MYSQL_ATTR_INIT_COMMAND=>Pdo\Mysql::ATTR_INIT_COMMANDPDO::MYSQL_ATTR_MAX_BUFFER_SIZE=>Pdo\Mysql::ATTR_MAX_BUFFER_SIZEPDO::MYSQL_ATTR_READ_DEFAULT_FILE=>Pdo\Mysql::ATTR_READ_DEFAULT_FILEPDO::MYSQL_ATTR_READ_DEFAULT_GROUP=>Pdo\Mysql::ATTR_READ_DEFAULT_GROUPPDO::MYSQL_ATTR_COMPRESS=>Pdo\Mysql::ATTR_COMPRESSPDO::MYSQL_ATTR_DIRECT_QUERY=>Pdo\Mysql::ATTR_DIRECT_QUERYPDO::MYSQL_ATTR_FOUND_ROWS=>Pdo\Mysql::ATTR_FOUND_ROWSPDO::MYSQL_ATTR_IGNORE_SPACE=>Pdo\Mysql::ATTR_IGNORE_SPACEPDO::MYSQL_ATTR_SSL_KEY=>Pdo\Mysql::ATTR_SSL_KEYPDO::MYSQL_ATTR_SSL_CERT=>Pdo\Mysql::ATTR_SSL_CERTPDO::MYSQL_ATTR_SSL_CA=>Pdo\Mysql::ATTR_SSL_CAPDO::MYSQL_ATTR_SSL_CAPATH=>Pdo\Mysql::ATTR_SSL_CAPATHPDO::MYSQL_ATTR_SSL_CIPHER=>Pdo\Mysql::ATTR_SSL_CIPHERPDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT=>Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERTPDO::MYSQL_ATTR_SERVER_PUBLIC_KEY=>Pdo\Mysql::ATTR_SERVER_PUBLIC_KEYPDO::MYSQL_ATTR_MULTI_STATEMENTS=>Pdo\Mysql::ATTR_MULTI_STATEMENTSPDO::ODBC_ATTR_USE_CURSOR_LIBRARY=>Pdo\Odbc::ATTR_USE_CURSOR_LIBRARYPDO::ODBC_ATTR_ASSUME_UTF8=>Pdo\Odbc::ATTR_ASSUME_UTF8PDO::ODBC_SQL_USE_IF_NEEDED=>Pdo\Odbc::SQL_USE_IF_NEEDEDPDO::ODBC_SQL_USE_DRIVER=>Pdo\Odbc::SQL_USE_DRIVERPDO::ODBC_SQL_USE_ODBC=>Pdo\Odbc::SQL_USE_ODBCPDO::PGSQL_ATTR_DISABLE_PREPARES=>Pdo\Pgsql::ATTR_DISABLE_PREPARESPDO::SQLITE_ATTR_EXTENDED_RESULT_CODES=>Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODESPDO::SQLITE_ATTR_OPEN_FLAGS=>Pdo\Sqlite::OPEN_FLAGSPDO::SQLITE_ATTR_READONLY_STATEMENT=>Pdo\Sqlite::ATTR_READONLY_STATEMENTPDO::SQLITE_DETERMINISTIC=>Pdo\Sqlite::DETERMINISTICPDO::SQLITE_OPEN_READONLY=>Pdo\Sqlite::OPEN_READONLYPDO::SQLITE_OPEN_READWRITE=>Pdo\Sqlite::OPEN_READWRITEPDO::SQLITE_OPEN_CREATE=>Pdo\Sqlite::OPEN_CREATE
已废弃 PDO 类中的驱动专属方法。受影响的方法及其替代项如下:
- PDO::pgsqlCopyFromArray() => Pdo\Pgsql::copyFromArray()
- PDO::pgsqlCopyFromFile() => Pdo\Pgsql::copyFromFile()
- PDO::pgsqlCopyToArray() => Pdo\Pgsql::copyToArray()
- PDO::pgsqlCopyToFile() => Pdo\Pgsql::copyToFile()
- PDO::pgsqlGetNotify() => Pdo\Pgsql::getNotify()
- PDO::pgsqlGetPid() => Pdo\Pgsql::getPid()
- PDO::pgsqlLOBCreate() => Pdo\Pgsql::lobCreate()
- PDO::pgsqlLOBOpen() => Pdo\Pgsql::lobOpen()
- PDO::pgsqlLOBUnlink() => Pdo\Pgsql::lobUnlink()
- PDO::sqliteCreateAggregate() => Pdo\Sqlite::createAggregate()
- PDO::sqliteCreateCollation() => Pdo\Sqlite::createCollation()
- PDO::sqliteCreateFunction() => Pdo\Sqlite::createFunction()
PDO_PGSQL
已废弃与事务状态相关的常量,因为 PDO 不支持此功能:
PDO::PGSQL_TRANSACTION_IDLEPDO::PGSQL_TRANSACTION_ACTIVEPDO::PGSQL_TRANSACTION_INTRANSPDO::PGSQL_TRANSACTION_INERRORPDO::PGSQL_TRANSACTION_UNKNOWN
Reflection
已废弃各类 Reflection 对象的 setAccessible() 方法,因为这些方法已不再生效。
已废弃调用 ReflectionClass::getConstant() 获取不存在的常量。
已废弃调用 ReflectionProperty::getDefaultValue() 获取无默认值的属性。
SPL
已废弃将 spl_autoload_call() 函数作为回调参数传递给 spl_autoload_unregister() 来注销所有自动加载器的做法。如有需要,应遍历 spl_autoload_functions() 的返回值,并对每个元素调用 spl_autoload_unregister()。
已废弃 SplObjectStorage::contains()、SplObjectStorage::attach() 和 SplObjectStorage::detach() 方法,分别推荐使用 SplObjectStorage::offsetExists()、SplObjectStorage::offsetSet() 和 SplObjectStorage::offsetUnset()。
已废弃将 ArrayObject 和 ArrayIterator 与对象一起使用。
标准
已废弃 socket_set_timeout() 别名函数,应改用 stream_set_timeout()。
已废弃将 null 传递给 readdir()、rewinddir() 和 closedir()
以使用最近打开的目录,应显式传入最近打开的目录资源。
现已废弃向 chr() 传入 [0, 255] 区间以外的整数,因为一个字节只能容纳该区间内的值。
现已废弃向 ord() 传入非单字节的字符串,这通常表明存在错误。
已废弃局部预定义变量 $http_response_header,应改用调用 http_get_last_response_headers() 函数。
XML
已废弃 xml_parser_free() 函数,因为 XMLParser 对象会自动释放。