## Backward Incompatible Changes

Although most existing PHP 5 code should work without changes, please take note of some backward incompatible changes:

- Safe mode is no longer supported. Any applications that rely on safe mode may need adjustment, in terms of security.
- Magic quotes has been removed. Applications relying on this feature may need to be updated, to avoid security issues. get_magic_quotes_gpc() and get_magic_quotes_runtime() now always return `FALSE`. set_magic_quotes_runtime() raises an `E_CORE_ERROR` level error on trying to enable Magic quotes.
- The register_globals and register_long_arrays php.ini directives have been removed.
- The mbstring.script_encoding directive has been removed. Use zend.script_encoding instead.
- Call-time pass by reference has been removed.
- The break and continue statements no longer accept variable arguments (e.g., `break 1 + foo() * $bar;`). Static arguments still work, such as `break 2;`. As a side effect of this change `break 0;` and `continue 0;` are no longer allowed.
- The default character set for htmlspecialchars(), htmlentities() and html_entity_decode() is now `UTF-8`, instead of `ISO-8859-1`. Note that changing your output charset via the default_charset configuration setting does not affect htmlspecialchars/htmlentities unless you are passing "" (an empty string) as the encoding parameter to your htmlspecialchars()/htmlentities()/html_entity_decode() calls. Generally we do not recommend doing this because you should be able to change your output charset without affecting the runtime charset used by these functions. The safest approach is to explicitly set the charset on each call to htmlspecialchars(), htmlentities() and html_entity_decode().
- In the date and time extension, the timezone can no longer be set using the TZ environment variable. Instead you have to specify a timezone using the date.timezone php.ini option or date_default_timezone_set() function. PHP will no longer attempt to guess the timezone, and will instead fall back to "UTC" and issue a `E_WARNING`.
- Non-numeric string offsets - e.g. `$a['foo']` where $a is a string - now return false on isset() and true on empty(), and produce a `E_WARNING` if you try to use them. Offsets of types double, bool and null produce a `E_NOTICE`. Numeric strings (e.g. `$a['2']`) still work as before. Note that offsets like `'12.3'` and `'5 foobar'` are considered non-numeric and produce a `E_WARNING`, but are converted to 12 and 5 respectively, for backward compatibility reasons. Note: Following code returns different result. $str='abc';var_dump(isset($str['x'])); // false for PHP 5.4 or later, but true for 5.3 or less
- Converting an array to a string will now generate an `E_NOTICE` level error, but the result of the cast will still be the string `"Array"`.
- Turning `NULL`, `FALSE`, or an empty string into an object by adding a property will now emit an `E_WARNING` level error, instead of `E_STRICT`.
- Parameter names that shadow super globals now cause a fatal error. This prohibits code like `function foo($_GET, $_POST) {}`.
- The Salsa10 and Salsa20 hash algorithms have been removed.
- The Tiger hash algorithm now uses big-endian byte ordering. Please follow this example to write code that is compatible with both PHP 5.3 and 5.4.
- array_combine() now returns `array()` instead of `FALSE` when two empty arrays are provided as parameters.
- If you use htmlentities() with asian character sets, it works like htmlspecialchars() - this has always been the case in previous versions of PHP, but now an `E_STRICT` level error is emitted.
- The third parameter of ob_start() has changed from bool `erase` to int `flags`. Note that code that explicitly set `erase` to `FALSE` will no longer behave as expected in PHP 5.4: please follow this example to write code that is compatible with PHP 5.3 and 5.4.
- stream_select() now preserves the keys of the `read`, `write` and `except` arrays.

The following keywords are now reserved, and may not be used as names by functions, classes, etc.

- trait
- callable
- insteadof

The following functions have been removed from PHP:

- define_syslog_variables()
- import_request_variables()
- session_is_registered(), session_register() and session_unregister().
- The aliases mysqli_bind_param(), mysqli_bind_result(), mysqli_client_encoding(), mysqli_fetch(), mysqli_param_count(), mysqli_get_metadata(), mysqli_send_long_data(), mysqli::client_encoding() and mysqli_stmt::stmt().