Backward incompatible changes
Throw on passing too few function arguments
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();
Результат выполнения данного примера в PHP 5.5:
Uncaught Error: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
Forbid dynamic calls to scope introspection functions
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:
- assert() - with a string as the first argument
- compact()
- extract()
- func_get_args()
- func_get_arg()
- func_num_args()
- get_defined_vars()
- mb_parse_str() - with one arg
- parse_str() - with one arg
<?php
(function () {
'func_num_args'();
})();
Результат выполнения данного примера:
Warning: Cannot call func_num_args() dynamically in %s on line %d
Invalid class, interface, and trait names
The following names cannot be used to name classes, interfaces, or traits:
- void
- iterable
Numerical string conversions now respect scientific notation
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().
Fixes to mt_rand() algorithm
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() aliased to mt_rand() and srand() aliased 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().
Disallow the ASCII delete control character in identifiers
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 loggged with the
notice level only.
Do not call destructors on incomplete objects
Destructors are no longer called upon incomplete objects (such as throwing an exception in the constructor).
call_user_func() fails on calls to functions with reference arguments
call_user_func() will now always fail upon calls to functions that expect references as arguments.
Removed ini directives
The following ini directives have been removed:
-
session.entropy_file
-
session.entropy_length
-
session.hash_function
-
session.hash_bits_per_character
Коментарии
For anyone migrating from 5.x to 7.1:
About "Array ordering when elements are automatically created during by reference assignments has changed" on this page
(migration71.incompatible#migration71.incompatible.array-order)
The behaviour of 7.1 is THE SAME as of PHP 5. It is only 7.0 that differs.
See https://3v4l.org/frbUc
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
"OMFG! Why was session.hash_function removed?!? Dude!"
https://wiki.php.net/rfc/session-id-without-hashing
There. Saved ya a search.
The backwards incompatible change 'The empty index operator is not supported for strings anymore' has a lot more implications than just a fatal error on the following code
<?php
$a = "";
$a[] = "hello world";
var_dump($a);
?>
This will give a fatal error in 7.1 but will work as expected in 7.0 or below and give you: (no notice, no warning)
array(1) {
[0]=>
string(11) "hello world"
}
However, the following is also changed:
<?php
$a = "";
$a[0] = "hello world";
var_dump($a);
// 7.1: string(1) "h"
// pre-7.1: array(1) { [0]=> string(11) "hello world" }
$a = "";
$a[5] = "hello world";
var_dump($a);
// 7.1: string(6) " h"
// pre-7.1: array(1) { [0]=> string(11) "hello world" }
?>
ArgumentCountError - this modification is the main reason to avoid this version on older projects.
Regarding the ArgumentCountError, PHP 7.1+ does still support user functions with a variable number of arguments, using the "func(...$args) {}" syntax, see: https://www.php.net/manual/en/functions.arguments.php#functions.variable-arg-list