Previously, a warning would be emitted for invoking user-defined functions with too few arguments. Now, this warning has been promoted to an Error exception. This change only applies to user-defined functions, not internal functions. For example:
<?php
function test($param){}
test();
The above example will output something similar to:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
Dynamic calls for certain functions have been forbidden (in the form of $func() or array_map('extract', ...), etc). These functions either inspect or modify another scope, and present with them ambiguous and unreliable behavior. The functions are as follows:
<?php
(function () {
$func = 'func_num_args';
$func();
})();
The above example will output:
Warning: Cannot call func_num_args() dynamically in %s on line %d
The following names cannot be used to name classes, interfaces, or traits:
Integer operations and conversions on numerical strings now respect scientific notation. This also includes the (int) cast operation, and the following functions: intval() (where the base is 10), settype(), decbin(), decoct(), and dechex().
mt_rand() will now default to using the fixed version of
the Mersenne Twister algorithm. If deterministic output from
mt_srand() was relied upon, then the
MT_RAND_PHP
with the ability to preserve the old
(incorrect) implementation via an additional optional second parameter to
mt_srand().
rand() and srand() have now been made aliases to mt_rand() and mt_srand(), respectively. This means that the output for the following functions have changes: rand(), shuffle(), str_shuffle(), and array_rand().
The ASCII delete control character (0x7F) can no longer be used in identifiers that are not quoted.
error_log
changes with syslog
value
If the error_log
ini setting is set to
syslog, the PHP error levels are mapped to the syslog
error levels. This brings finer differentiation in the error logs in
contrary to the previous approach where all the errors are logged with the
notice level only.
Destructors are now never called for objects that throw an exception during the execution of their constructor. In previous versions this behavior depended on whether the object was referenced outside the construcor (e.g. by an exception backtrace).
call_user_func() will now always generate a warning upon calls to functions that expect references as arguments. Previously this depended on whether the call was fully qualified.
Additionally, call_user_func() and call_user_func_array() will no longer abort the function call in this case. The "expected reference" warning will be emitted, but the call will proceed as usual.
Applying the empty index operator to a string (e.g. $str[] = $x) throws a fatal error instead of converting silently to array.
The following ini directives have been removed:
session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character
The order of the elements in an array has changed when those elements have been automatically created by referencing them in a by reference assignment. For example:
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>
Output of the above example in PHP 7.0:
array(2) { ["a"]=> &int(1) ["b"]=> &int(1) }
Output of the above example in PHP 7.1:
array(2) { ["b"]=> &int(1) ["a"]=> &int(1) }
The internal sorting algorithm has been improved, what may result in different sort order of elements, which compare as equal, than before.
Note:
Don't rely on the order of elements which compare as equal; it might change anytime.