Deprecated Features

- « Backward Incompatible Changes

- Removed Extensions »

- PHP Manual
- Migrating from PHP 8.3.x to PHP 8.4.x
- Deprecated Features

## Deprecated Features

### PHP Core

#### Implicitly nullable parameter

A parameter's type is implicitly widened to accept null if the default value for it is `null`.

The following code:

    <?php
    function foo(T1 $a = null) {}

should be converted to:

    <?php
    function foo(T1|null $a = null) {}

or

    <?php
    function foo(?T1 $a = null) {}

However, if such a parameter declaration is followed by a mandatory parameter:

    <?php
    function foo(T1 $a, T2 $b = null, T3 $c) {}

It must be converted to:

    <?php
    function foo(T1 $a, T2|null $b, T3 $c) {}

or

    <?php
    function foo(T1 $a, ?T2 $b, T3 $c) {}

as optional parameter before required ones are deprecated.

#### Raising zero to the power of negative number

Raising a number to the power of a negative number is equivalent to taking the reciprocal of the number raised to the positive opposite of the power. That is, `10-2` is the same as `1 / 102`. Therefore raising `0` to the power of a negative number corresponds to dividing by `0`, i.e. `0-2` is the same as `1 / 02`, or `1 / 0`. Thus, this behavior has been deprecated.

This affects the exponentiation operator `**` and the pow() function.

If the IEEE 754 semantics are desired one should use the new fpow() function.

#### Using underscore `_` as class name

Naming a class `_` is now deprecated:

    <?php
    class _ {}

> Note:

> Classes whose names start with an underscore are not deprecated:

>     <?php
>     class _MyClass {}

#### Using trigger_error() with `E_USER_ERROR`

Calling trigger_error() with `error_level` being equal to `E_USER_ERROR` is now deprecated.

Such usages should be replaced by either throwing an exception, or calling exit(), whichever is more appropriate.

#### The `E_STRICT` constant

Because the `E_STRICT` error level was removed, this constant is now deprecated.

### cURL

The `CURLOPT_BINARYTRANSFER` constant is now deprecated.

### Date

The `DatePeriod::__construct(string $isostr, int $options = 0)` signature has been deprecated. Use DatePeriod::createFromISO8601String() instead.

The `SUNFUNCS_RET_TIMESTAMP`, `SUNFUNCS_RET_STRING`, and `SUNFUNCS_RET_DOUBLE` constants are now deprecated. This follows from the deprecation of the date_sunset() and date_sunrise() functions in PHP 8.1.0.

### DBA

Passing `null` or `false` to dba_key_split() is now deprecated. It would always return `false` in those cases.

### DOM

The `DOM_PHP_ERR` constant is now deprecated.

The following properties have been formally deprecated:

- DOMDocument::$actualEncoding
- DOMDocument::$config
- DOMEntity::$actualEncoding
- DOMEntity::$encoding
- DOMEntity::$version

### Hash

Passing invalid options to hash functions is now deprecated.

### Intl

Calling intlcal_set() or IntlCalendar::set() with more than two arguments is deprecated. Use either IntlCalendar::setDate() or IntlCalendar::setDateTime() instead.

Calling intlgregcal_create_instance() or IntlGregorianCalendar::__construct() with more than two arguments is deprecated. Use either IntlGregorianCalendar::createFromDate() or IntlGregorianCalendar::createFromDateTime() instead.

### LDAP

Calling ldap_connect() with more than two arguments is deprecated. Use ldap_connect_wallet() instead.

Calling ldap_exop() with more than four arguments is deprecated. Use ldap_exop_sync() instead.

### MySQLi

The mysqli_ping() function and mysqli::ping() method are now deprecated as the reconnect feature was removed in PHP 8.2.0.

The mysqli_kill() function and mysqli::kill() method are now deprecated. If this functionality is needed a SQL `KILL` command can be used instead.

The mysqli_refresh() function and mysqli::refresh() method are now deprecated. If this functionality is needed a SQL `FLUSH` command can be used instead. All `MYSQLI_REFRESH_*` constants have been deprecated as well.

Passing the `mode` parameter to mysqli_store_result() explicitly has been deprecated. As the `MYSQLI_STORE_RESULT_COPY_DATA` constant was only used in conjunction with this function it has also been deprecated.

### PDO_PGSQL

Using escaped question marks (`??`) inside dollar-quoted strings is deprecated. Because PDO_PGSQL now has its own SQL parser with dollar-quoted strings support, it is no longer necessary to escape question marks inside them.

### PGSQL

The 2 arguments signature of pg_fetch_result(), pg_field_prtlen(), and pg_field_is_null() is now deprecated. Use the 3 arguments signature with `row` set to `null` instead.

### Random

lcg_value() is now deprecated, as the function is broken in multiple ways. Use Random\Randomizer::getFloat() instead.

### Reflection

Calling ReflectionMethod::__construct() with one arguments is deprecated. Use ReflectionMethod::createFromMethodName() instead.

### Session

Calling session_set_save_handler() with more than two arguments is deprecated. Use the two arguments signature instead.

Changing the value of the `session.sid_length` and `session.sid_bits_per_character` INI settings is deprecated. Update the session storage backend to accept 32 character hexadecimal session IDs and stop changing these two INI settings instead.

Changing the value of the `session.use_only_cookies`, `session.use_trans_sid`, `session.trans_sid_tags`, `session.trans_sid_hosts`, and `session.referer_check` INI settings is deprecated. The `SID` constant is also deprecated.

### SOAP

Passing an int to SoapServer::addFunction() is now deprecated. If all PHP functions need to be provided flatten the array returned by get_defined_functions().

The `SOAP_FUNCTIONS_ALL` constant is now deprecated.

### SPL

The SplFixedArray::__wakeup() method is now deprecated, as it implements SplFixedArray::__serialize() and SplFixedArray::__unserialize() which need to be overwritten instead.

Using the default value for the `escape` parameter for the SplFileObject::setCsvControl(), SplFileObject::fputcsv(), and SplFileObject::fgetcsv() is now deprecated. It must be passed explicitly either positionally or via named arguments. This does not apply to SplFileObject::fputcsv() and SplFileObject::fgetcsv() if SplFileObject::setCsvControl() was used to set a new default value.

### Standard

Calling stream_context_set_option() with two arguments is deprecated. Use stream_context_set_options() instead.

Unserializing strings using the uppercase `S` tag with unserialize() is deprecated.

Using the default value for the `escape` parameter for the fputcsv(), fgetcsv(), and str_getcsv() is now deprecated. It must be passed explicitly either positionally or via named arguments.

### XML

The xml_set_object() function has been deprecated.

Passing non-callable strings to the xml_set_()* functions is now deprecated.