# Deprecated Features

## PHP Core

### Changes to user output handler

Trying to produce output (e.g. with `echo`) within a user output handler is deprecated. The deprecation warning will bypass the handler producing the output to ensure it is visible; if there are nested output handlers the next one will still be used.

### Non-canonical cast names

Non-canonical cast names `(boolean)`, `(integer)`, `(double)`, and `(binary)` have been deprecated, use `(bool)`, `(int)`, `(float)`, and `(string)` respectively.

### Terminating case statements with a semicolon

Terminating case statements with a semicolon instead of a colon has been deprecated.

### The backtick operator

[The backtick operator](#language.operators.execution) as an alias for `shell_exec` has been deprecated.

### Returning null from \_\_debugInfo()

Returning ENTITY from [\_\_debugInfo()](#language.oop5.magic.debuginfo) has been deprecated. Return an empty array instead.

### report_memleaks INI directive

The [report_memleaks](#ini.report-memleaks) INI directive has been deprecated.

### Constant redeclaration

Constant redeclaration has been deprecated. Note that this already generated a warning and will continue to do so.

### Closure binding issues

The following closure binding issues, which already emit an `E_WARNING`, are now deprecated: Binding an instance to a static closure., Binding methods to objects that are not instances of the class (or subclass) that the method is defined., Unbinding \$this from a method., Unbinding \$this from a closure that uses \`\$this\`., Binding a closure to the scope of an internal class., Rebinding the scope of a closure created from a function or method.

### \_\_sleep() and \_\_wakeup() magic methods

The [\_\_sleep()](#object.sleep) and [\_\_wakeup()](#object.wakeup) magic methods have been soft-deprecated. The [\_\_serialize()](#object.serialize) and [\_\_unserialize()](#object.unserialize) magic methods should be used instead, or at the same time if compatibility with PHP 7 is required.

### Using null as an array offset

Using ENTITY as an array offset or when calling `array_key_exists` is now deprecated. Instead an empty string should be used.

### Incrementing non-numeric strings

Incrementing non-numeric strings is now deprecated. Instead the `str_increment` function should be used.

### register_argc_argv INI directive

Deriving `$_SERVER['argc']` and `$_SERVER['argv']` from the query string for non-CLI SAPIs has been deprecated. Configure `register_argc_argv=0` and switch to either `$_GET` or `$_SERVER['QUERY_STRING']` to access the information, after verifying that the usage is safe.

## cURL

The `curl_close` function has been deprecated, as `CurlHandle` objects are freed automatically.

The `curl_share_close` function has been deprecated, as `CurlShareHandle` objects are freed automatically.

## Date

The `DATE_RFC7231` and `DateTimeInterface::RFC7231` constants have been deprecated. This is because the associated timezone is ignored and always uses GMT.

## FileInfo

The `finfo_close` function has been deprecated. As `finfo` objects are freed automatically.

The `context` parameter of the `finfo_buffer` function has been deprecated as it is ignored.

## GD

The `imagedestroy` function has been deprecated, as `GdImage` objects are freed automatically.

## Hash

The `MHASH_*` constants have been deprecated.

## Intl

The [intl.error_level](#ini.intl.error-level) INI setting has been deprecated. Errors should either be checked manually or exceptions should be enabled by using the [intl.use_exceptions](#ini.intl.use-exceptions) INI setting.

## LDAP

Specific Oracle Instant Client calls and constants have been deprecated. List of affected calls: `ldap_connect` with wallet support, `ldap_connect_wallet` List of affected constants: `GSLC_SSL_NO_UATH`, `GSLC_SSL_ONEWAY_UATH`, `GSLC_SSL_TWOWAY_UATH`

## MySQLi

The `mysqli_execute` alias function has been deprecated. Use `mysqli_stmt_execute` instead.

## OpenSSL

The `key_length` parameter for `openssl_pkey_derive` has been deprecated. This is because it is either ignored, or truncates the key, which can be a security vulnerability.

## PDO

The `"uri:"` DSN scheme has been deprecated due to security concerns with DSNs coming from remote URIs.

Driver specific constants in the PDO class have been deprecated. List of affected constants and their replacement: `PDO::DBLIB_ATTR_CONNECTION_TIMEOUT` =\> `Pdo\Dblib::ATTR_CONNECTION_TIMEOUT`, `PDO::DBLIB_ATTR_QUERY_TIMEOUT` =\> `Pdo\Dblib::ATTR_QUERY_TIMEOUT`, `PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER` =\> `Pdo\Dblib::ATTR_STRINGIFY_UNIQUEIDENTIFIER`, `PDO::DBLIB_ATTR_VERSION` =\> `Pdo\Dblib::ATTR_VERSION`, `PDO::DBLIB_ATTR_TDS_VERSION` =\> `Pdo\Dblib::ATTR_TDS_VERSION`, `PDO::DBLIB_ATTR_SKIP_EMPTY_ROWSETS` =\> `Pdo\Dblib::ATTR_SKIP_EMPTY_ROWSETS`, `PDO::DBLIB_ATTR_DATETIME_CONVERT` =\> `Pdo\Dblib::ATTR_DATETIME_CONVERT`, `PDO::FB_ATTR_DATE_FORMAT` =\> `Pdo\Firebird::ATTR_DATE_FORMAT`, `PDO::FB_ATTR_TIME_FORMAT` =\> `Pdo\Firebird::ATTR_TIME_FORMAT`, `PDO::FB_ATTR_TIMESTAMP_FORMAT` =\> `Pdo\Firebird::ATTR_TIMESTAMP_FORMAT`, `PDO::MYSQL_ATTR_USE_BUFFERED_QUERY` =\> `Pdo\Mysql::ATTR_USE_BUFFERED_QUERY`, `PDO::MYSQL_ATTR_LOCAL_INFILE` =\> `Pdo\Mysql::ATTR_LOCAL_INFILE`, `PDO::MYSQL_ATTR_LOCAL_INFILE_DIRECTORY` =\> `Pdo\Mysql::ATTR_LOCAL_INFILE_DIRECTORY`, `PDO::MYSQL_ATTR_INIT_COMMAND` =\> `Pdo\Mysql::ATTR_INIT_COMMAND`, `PDO::MYSQL_ATTR_MAX_BUFFER_SIZE` =\> `Pdo\Mysql::ATTR_MAX_BUFFER_SIZE`, `PDO::MYSQL_ATTR_READ_DEFAULT_FILE` =\> `Pdo\Mysql::ATTR_READ_DEFAULT_FILE`, `PDO::MYSQL_ATTR_READ_DEFAULT_GROUP` =\> `Pdo\Mysql::ATTR_READ_DEFAULT_GROUP`, `PDO::MYSQL_ATTR_COMPRESS` =\> `Pdo\Mysql::ATTR_COMPRESS`, `PDO::MYSQL_ATTR_DIRECT_QUERY` =\> `Pdo\Mysql::ATTR_DIRECT_QUERY`, `PDO::MYSQL_ATTR_FOUND_ROWS` =\> `Pdo\Mysql::ATTR_FOUND_ROWS`, `PDO::MYSQL_ATTR_IGNORE_SPACE` =\> `Pdo\Mysql::ATTR_IGNORE_SPACE`, `PDO::MYSQL_ATTR_SSL_KEY` =\> `Pdo\Mysql::ATTR_SSL_KEY`, `PDO::MYSQL_ATTR_SSL_CERT` =\> `Pdo\Mysql::ATTR_SSL_CERT`, `PDO::MYSQL_ATTR_SSL_CA` =\> `Pdo\Mysql::ATTR_SSL_CA`, `PDO::MYSQL_ATTR_SSL_CAPATH` =\> `Pdo\Mysql::ATTR_SSL_CAPATH`, `PDO::MYSQL_ATTR_SSL_CIPHER` =\> `Pdo\Mysql::ATTR_SSL_CIPHER`, `PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT` =\> `Pdo\Mysql::ATTR_SSL_VERIFY_SERVER_CERT`, `PDO::MYSQL_ATTR_SERVER_PUBLIC_KEY` =\> `Pdo\Mysql::ATTR_SERVER_PUBLIC_KEY`, `PDO::MYSQL_ATTR_MULTI_STATEMENTS` =\> `Pdo\Mysql::ATTR_MULTI_STATEMENTS`, `PDO::ODBC_ATTR_USE_CURSOR_LIBRARY` =\> `Pdo\Odbc::ATTR_USE_CURSOR_LIBRARY`, `PDO::ODBC_ATTR_ASSUME_UTF8` =\> `Pdo\Odbc::ATTR_ASSUME_UTF8`, `PDO::ODBC_SQL_USE_IF_NEEDED` =\> `Pdo\Odbc::SQL_USE_IF_NEEDED`, `PDO::ODBC_SQL_USE_DRIVER` =\> `Pdo\Odbc::SQL_USE_DRIVER`, `PDO::ODBC_SQL_USE_ODBC` =\> `Pdo\Odbc::SQL_USE_ODBC`, `PDO::PGSQL_ATTR_DISABLE_PREPARES` =\> `Pdo\Pgsql::ATTR_DISABLE_PREPARES`, `PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES` =\> `Pdo\Sqlite::ATTR_EXTENDED_RESULT_CODES`, `PDO::SQLITE_ATTR_OPEN_FLAGS` =\> `Pdo\Sqlite::ATTR_OPEN_FLAGS`, `PDO::SQLITE_ATTR_READONLY_STATEMENT` =\> `Pdo\Sqlite::ATTR_READONLY_STATEMENT`, `PDO::SQLITE_DETERMINISTIC` =\> `Pdo\Sqlite::DETERMINISTIC`, `PDO::SQLITE_OPEN_READONLY` =\> `Pdo\Sqlite::OPEN_READONLY`, `PDO::SQLITE_OPEN_READWRITE` =\> `Pdo\Sqlite::OPEN_READWRITE`, `PDO::SQLITE_OPEN_CREATE` =\> `Pdo\Sqlite::OPEN_CREATE`

Driver specific methods in the PDO class have been deprecated. List of affected methods and their replacement: 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

Constants related to transaction states have been deprecated as this feature is unavailable with PDO: `PDO::PGSQL_TRANSACTION_IDLE`, `PDO::PGSQL_TRANSACTION_ACTIVE`, `PDO::PGSQL_TRANSACTION_INTRANS`, `PDO::PGSQL_TRANSACTION_INERROR`, `PDO::PGSQL_TRANSACTION_UNKNOWN`

## Reflection

The `setAccessible()` methods of various Reflection objects have been deprecated, as those no longer have an effect.

Calling ReflectionClass::getConstant for constants that do not exist has been deprecated.

Calling ReflectionProperty::getDefaultValue for properties without default values has been deprecated.

## SPL

Unregistering all autoloaders by passing the `spl_autoload_call` function as a callback argument to `spl_autoload_unregister` has been deprecated. Instead if this is needed, one should iterate over the return value of `spl_autoload_functions` and call `spl_autoload_unregister` on each value.

The SplObjectStorage::contains, SplObjectStorage::attach, and SplObjectStorage::detach methods have been deprecated in favour of SplObjectStorage::offsetExists, SplObjectStorage::offsetSet, and SplObjectStorage::offsetUnset respectively.

Using `ArrayObject` and `ArrayIterator` with objects has been deprecated.

## Standard

The `socket_set_timeout` alias function has been deprecated. Use `stream_set_timeout` instead.

Passing ENTITY to `readdir`, `rewinddir`, and `closedir` to use the last opened directory has been deprecated. Provide the last opened directory explicitly instead.

Passing integers outside the interval `[0, 255]` to `chr` is now deprecated. This is because a byte can only hold a value within this interval.

Passing a string which is not a single byte to `ord` is now deprecated, this is indicative of a bug.

The locally predefined variable [\$http_response_header](#reserved.variables.httpresponseheader) is deprecated. Instead one should call the `http_get_last_response_headers` function.

## XML

The `xml_parser_free` function has been deprecated, as `XMLParser` objects are freed automatically.