Ранее, если пользовательская функция вызывалась с недостаточным количеством аргументов, выдавалось предупреждение. Теперь же, вместо предупреждения будет вызываться исключение класса Error. Это изменение затрагивает только пользовательские функции и не оказывает влияния на встроенные. Например:
<?php
function test($param){}
test();
Результатом выполнения данного примера будет что-то подобное:
Fatal error: Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed in %s on line %d and exactly 1 expected in %s:%d
Динамические вызовы определенных функций были запрещены (в виде $func() или array_map('extract', ...), и т.д.) Эти функции проверяют или модифицируют объекты другой области видимости, чем вызывают неоднозначное и неопределенное поведение. Список таких функций:
<?php
(function () {
$func = 'func_num_args';
$func();
})();
Результат выполнения данного примера:
Warning: Cannot call func_num_args() dynamically in %s on line %d
Следующие имена нельзя использовать как имена классов, интерфейсов или трейтов:
Целочисленные операции и конвертации числовых строк теперь учитывают научную нотацию, включая приведение (int) и следующие функции: intval() (с базой 10), settype(), decbin(), decoct() и dechex().
mt_rand() теперь по умолчанию использует зафиксированную версию
алгоритма "Вихрь Мерсена". Если вы полагались на детерминированный вывод
mt_srand(), для сохранения старого (неправильного) поведения,
можно использовать константу MT_RAND_PHP
в качестве второго,
необязательного, параметра mt_srand().
rand() и srand() теперь являются просто синонимами для mt_rand() и mt_srand(). Это означает, что вывод следующих функций изменился: rand(), shuffle(), str_shuffle() и array_rand().
Символ удаления ASCII (0x7F) больше нельзя использовать в идентификаторах, не обернутых в кавычки.
error_log
изменено на syslog
Если ini-параметр error_log
установлен как
syslog, то уровни ошибок PHP проецируются на уровни ошибок "syslog".
Это позволяет более тонко логировать события, а не как раньше, когда все они
записывались с уровнем "notice".
Теперь деструкторы никогда не вызываются, если было вызвано исключение в конструкторе объекта. Раньше это поведение зависело от того, была ли ссылка на объект вне конструктора (например, в трассировке исключения).
Теперь call_user_func() всегда вызывает предупреждение, если вызывается функция, ожидающая ссылки в качестве параметров. Ранее это зависело от того, был ли вызов полностью определенным.
Кроме того, call_user_func() и call_user_func_array() больше не прекращают выполнение функции в этом случае. Предупреждение "expected reference" будет вызвано, но сама функция продолжит выполнение.
Применение оператора пустого индекса к строке ($str[] = $x) вызывает фатальную ошибку вместо тихого преобразования переменной к массиву.
Модификация символа в пустой строке теперь работает так же как и для не пустой. Т.е. запись по несуществующему смещению приведет к преобразованию не целочисленного значения смещения к целому числу, дополнению строки до нужной длины символами пробела и использованию только первого символа из присваиваемой строки. Раньше, в такой ситуации, пустая строка рассматривалась как пустой массив.
<?php
$a = '';
$a[10] = 'foo';
var_dump($a);
?>
Результат выполнения данного примера в PHP 7.0:
array(1) { [10]=> string(3) "foo" }
Результат выполнения данного примера в PHP 7.1:
string(11) " f"
Следующие ini-директивы были удалены:
session.entropy_file
session.entropy_length
session.hash_function
session.hash_bits_per_character
Порядок расположения элементов массива, создаваемых присвоением по ссылке не созданных на момент присвоения элементов, был изменен. К примеру:
<?php
$array = [];
$array["a"] =& $array["b"];
$array["b"] = 1;
var_dump($array);
?>
Результат выполнения данного примера в PHP 7.0:
array(2) { ["a"]=> &int(1) ["b"]=> &int(1) }
Результат выполнения данного примера в PHP 7.1:
array(2) { ["b"]=> &int(1) ["a"]=> &int(1) }
Внутренний алгоритм сортировки был улучшен, что может привести к отличию в порядке расположения эквивалентных элементов после сортировки по сравнению с предыдущими версиями PHP.
Замечание:
Не полагайтесь на порядок расположения эквивалентных элементов, так как он может в любой момент измениться.
Сообщения для ошибок E_RECOVERABLE изменено с "Catchable fatal error" на "Recoverable fatal error".
Теперь элемент allowed_classes параметра $options функции
unserialize() строго типизирован, то есть если передать
значение с типом, отличным от array и boolean,
то unserialize() вернет FALSE
и вызовет ошибку уровня E_WARNING
.
Теперь DateTime и DateTimeImmutable
используют микросекунды при создании с текущим временем, либо в явном виде,
либо со строкой относительного времени (например, "first day of next
month"). Это означает, что сравнение двух подряд созданных экземпляров
класса скорее будет возвращать FALSE
нежели TRUE
:
<?php
new DateTime() == new DateTime();
?>
Для расширения Date при некорректных данных сериализации классов DateTime или DatePeriod, или ошибки инициализации временной зоны из сериализованных данных, будет выбрасываться исключение Error из методов __wakeup() или __set_state(), вместо вызова фатальной ошибки.
В расширении DBA функции манипулирования данными (такие как dba_insert()) теперь будут выбрасывать исключение Error вместо вызова отлавливаемой фатальной ошибки если ключ не содержит ровно двух элементов.
В расширении DOM некорректная проверка контекста схемы или RelaxNG теперь будут выбрасывать исключение Error вместо вызова фатальной ошибки. Аналогичным образом, попытки зарегистрировать класс узла, который не расширяет правильный базовый класс, попытки прочитать некорректное свойство или перезаписать свойство доступное только для чтения будут выбрасывать исключение Error.
В расширение IMAP адрес email длиннее 16385 байт теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки.
Расширение Intl при ошибке вызова родительского конструктора в классе, наследующем Collator до вызова родительских методов теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки. Кроме того, клонирование объекта Transliterator теперь будет выбрасывать исключение Error при ошибке клонирования внутреннего transliterator вместо вызова фатальной ошибки.
Расширение LDAP при указании неизвестного типа модификации в ldap_batch_modify() теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки.
В расширении mbstring функции mb_ereg() и mb_eregi() теперь будут выбрасывать исключение ParseError в случае некорректного регулярного выражения либо в случае использования опции 'e'.
В расширении Mcrypt mcrypt_encrypt() и mcrypt_decrypt() теперь будет выбрасывать исключение Error вместо вызова фатальной ошибки, если mcrypt не инициализирован.
В расширении mysqli попытки прочитать некорректное свойство или перезаписать свойство доступное только для чтения будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В расширении Reflection неудачное извлечение отраженного объекта или свойства объекта будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В расширении сессий пользовательские обработчики сессии, которые не возвращают строку для идентификатора сессии, будут выбрасывать исключение Error вместо вызова фатальной ошибки, когда будет вызвана функция для генерации идентификатора.
В расширении SimpleXML попытка создания безымянного либо дублирующего атрибута будет выбрасывать исключение Error вместо вызова фатальной ошибки.
В расширении SPL попытка клонировать объект SplDirectory будет выбрасывать исключение Error вместо вызова фатальной ошибки. Аналогично, вызов ArrayIterator::append() когда итерация объекта закончена будет выбрасывать исключение Error.
Функция assert(), когда ей передан строковый аргумент первым параметром, теперь будет выбрасывать исключение ParseError вместо вызова отлавливаемой фатальной ошибки, если PHP-код некорректен. Аналогично, вызов forward_static_call() за пределами пространства класса будет выбрасывать исключение Error.
В расширении Tidy ручное создание tidyNode будет выбрасывать исключение Error.
В расширении WDDX циклические ссылки при сериализации будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В расширении XML-RPC циклические ссылки при сериализации будут выбрасывать исключение Error вместо вызова фатальной ошибки.
В расширении Zip метод ZipArchive::addGlob() будет выбрасывать исключение Error вместо вызова фатальной ошибки, если отсутствует поддержка glob.
Переменные, привязанные к замыканию через конструкцию use, не могут использовать те же имена, что и любые superglobals, $this или параметры. К примеру, все приведенные функции вызовут фатальную ошибку:
<?php
$f = function () use ($_SERVER) {};
$f = function () use ($this) {};
$f = function ($param) use ($param) {};
INI-настройка serialize_precision
определяет точность сериализации
при кодировании значений типа float.
Теперь декодирование пустого ключа приводит к появлению свойства с пустым именем, раньше имя свойства приводилось к значению _empty_.
<?php
var_dump(json_decode(json_encode(['' => 1])));
Результатом выполнения данного примера будет что-то подобное:
object(stdClass)#1 (1) { [""]=> int(1) }
При передаче флага JSON_UNESCAPED_UNICODE
в функцию
json_encode() последовательности U+2028 и U+2029 будут экранированы.
Третий параметр функций mb_ereg() и
mb_eregi() (regs
) теперь устанавливается
равным пустому массиву, если не было найдено совпадений. Ранее параметр
оставался неизменным.
Поддержка потока sslv2 в OpenSSL удалена.