Изменения, ломающие обратную совместимость
Вызов исключения при передаче функции недостаточного количества аргументов
Ранее, если пользовательская функция вызывалась с недостаточным количеством
аргументов, выдавалось предупреждение. Теперь же, вместо предупреждения будет
вызываться исключение класса Error. Это изменение затрагивает только пользовательские
функции и не оказывает влияния на встроенные. Например:
Запрет динамического вызова функций интроспекции области видимости
Динамические вызовы определённых функций были запрещены (в виде
$func()
или array_map('extract', ...)
, и т.д.)
Эти функции проверяют или модифицируют объекты другой области видимости, чем
вызывают неоднозначное и неопределённое поведение.
Список таких функций:
Некорректные имена классов, интерфейсов и трейтов
Следующие имена нельзя использовать как имена классов, интерфейсов или трейтов:
Преобразование числовых строк теперь учитывает научную нотацию
Целочисленные операции и конвертации числовых строк теперь учитывают научную нотацию,
включая приведение (int)
и следующие функции:
intval() (с базой 10), settype(),
decbin(), decoct() и dechex().
Исправление алгоритма mt_rand()
mt_rand() теперь по умолчанию использует зафиксированную версию
алгоритма "Вихрь Мерсена". Если вы полагались на детерминированный вывод
mt_srand(), можно использовать константу MT_RAND_PHP
в качестве второго,
необязательного, параметра mt_srand() для сохранения старой (неправильной) реализации.
Запрет использовать символ удаления из таблицы ASCII в идентификаторах
Символ удаления ASCII (0x7F
) больше нельзя использовать в
идентификаторах, не обёрнутых в кавычки.
Значение error_log
изменено на syslog
Если ini-параметр error_log
установлен как
syslog
, то уровни ошибок PHP проецируются на уровни ошибок "syslog".
Это позволяет более тонко логировать события, а не как раньше, когда все они
записывались с уровнем "notice".
Деструкторы не вызываются на незавершённых объектах
Теперь деструкторы никогда не вызываются, если было вызвано исключение в
конструкторе объекта. Раньше это поведение зависело от того, была ли ссылка на
объект вне конструктора (например, в трассировке исключения).
call_user_func() обрабатывает ссылки на аргументы
Теперь call_user_func() всегда вызывает предупреждение,
если вызывается функция, ожидающая ссылки в качестве параметров.
Ранее это зависело от того, был ли вызов полностью определённым.
Кроме того, call_user_func() и
call_user_func_array() больше не прекращают выполнение функции в
этом случае. Предупреждение "expected reference" будет вызвано, но сама функция
продолжит выполнение.
Оператор пустого индекса более не применим к строкам
Применение оператора пустого индекса к строке ($str[] = $x
)
вызывает фатальную ошибку вместо тихого преобразования переменной к массиву.
Присвоение через механизм доступа к элементу строки по индексу применительно к пустой строке
Модификация символа в пустой строке теперь работает так же как и для не пустой.
Т.е. запись по несуществующему смещению приведёт к преобразованию не целочисленного
значения смещения к целому числу, дополнению строки до нужной длины символами
пробела и использованию только первого символа из присваиваемой строки. Раньше,
в такой ситуации, пустая строка рассматривалась как пустой массив.
Удалённые ini-директивы
Следующие ini-директивы были удалены:
-
session.entropy_file
-
session.entropy_length
-
session.hash_function
-
session.hash_bits_per_character
Порядок массива, когда элементы созданы автоматически через присвоение по ссылке, был
изменён
Порядок расположения элементов массива, создаваемых присвоением по ссылке не созданных
на момент присвоения элементов, был изменён.
К примеру:
Порядок сортировки эквивалентных элементов
Внутренний алгоритм сортировки был улучшен, что может привести
к отличию в порядке расположения эквивалентных элементов
после сортировки по сравнению с предыдущими версиями PHP.
Замечание:
Не полагайтесь на порядок расположения эквивалентных элементов, так как
он может в любой момент измениться.
Сообщения для ошибок E_RECOVERABLE
Сообщения для ошибок E_RECOVERABLE изменено с "Catchable
fatal error" на "Recoverable fatal error".
Параметр $options функции unserialize()
Теперь элемент allowed_classes
параметра $options функции
unserialize() строго типизирован, то есть если передать
значение с типом, отличным от array и bool,
то unserialize() вернёт false
и вызовет ошибку уровня E_WARNING
.
Конструктор DateTime использует микросекунды
Теперь DateTime и DateTimeImmutable
используют микросекунды при создании с текущим временем, либо в явном виде,
либо со строкой относительного времени (например, "first day of next
month"
). Это означает, что сравнение двух подряд созданных экземпляров
класса скорее будет возвращать false
нежели true
:
Вызов исключений Error вместо фатальных ошибок
Для модуля 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 или параметры. К примеру,
все приведённые функции вызовут фатальную ошибку:
Кодирование и декодирование JSON
INI-настройка serialize_precision
определяет точность сериализации
при кодировании значений типа float.
Теперь декодирование пустого ключа приводит к появлению свойства с пустым именем,
раньше имя свойства приводилось к значению _empty_
.
При передаче флага JSON_UNESCAPED_UNICODE
в функцию
json_encode() последовательности U+2028 и U+2029 будут экранированы.
Третий параметр функций mb_ereg() и
mb_eregi() (regs
) теперь устанавливается
равным пустому массиву, если не было найдено совпадений. Ранее параметр
оставался неизменным.
Удалена поддержка потока sslv2
Поддержка потока sslv2 в OpenSSL удалена.
Запрещён "return;" для типизированных возвратов уже во время компиляции
Операторы возврата без аргументов в функциях, которые объявляют тип возвращаемого значения,
теперь вызывают E_COMPILE_ERROR
(если тип возврата не
объявлен как void), даже если оператор возврата никогда
не будет достигнут.