Благодаря введению гибкого синтаксиса heredoc/nowdoc, doc-строки, содержащие закрывающие идентификаторы внутри своего тела, могут вызвать синтаксические ошибки или изменения в интерпретации. Пример:
<?php
$str = <<<FOO
abcdefg
FOO
FOO;
?>
Выражения continue, используемые в структурах управления потока switch теперь будет выдавать предупреждение. В PHP такие выражения continue эквиваленты break, в то время, как в других языках они ведут себя как continue 2.
<?php
while ($foo) {
switch ($bar) {
case "baz":
continue;
// Предупреждение: "continue" эквивалентен
// "break". Возможно, вы имели в виду "continue 2"?
}
}
?>
Доступ к массиву типа $obj["123"], где $obj реализует ArrayAccess, а "123" - это целочисленный строковый литерал, больше не приведет к неявному преобразованию в целое число, т.е. $obj->offsetGet("123") вместо $obj->offsetGet(123). Это соответствует существующему поведению для нелитеральных значений. Поведение массивов никак не изменилось, они продолжают неявно преобразовывать целые строковые ключи в целые числа.
В PHP статические свойства совместно используются наследующими классами, если статическое свойство явно не переопределено в дочернем классе. Однако из-за ошибки реализации можно было отделить статические свойства, присвоив их по ссылке. Эта лазейка была исправлена.
<?php
class Test {
public static $x = 0;
}
class Test2 extends Test { }
Test2::$x = &$x;
$x = 1;
var_dump(Test::$x, Test2::$x);
// Ранее: int(0), int(1)
// Теперь: int(1), int(1)
?>
Ссылки, возвращаемые доступом к массиву и свойству, теперь распаковываются как часть доступа. Это означает, что больше невозможно изменить ссылку между доступом и использованием доступного значения:
<?php
$arr = [1];
$ref =& $arr[0];
var_dump($arr[0] + ($arr[0] = 2));
// Ранее: int(4), Теперь: int(3)
?>
Распаковка аргументов перестала работать со значением Traversable с нечисловыми ключами. Следующий код работает в PHP 5.6-7.2 по ошибке.
<?php
function foo(...$args) {
var_dump($args);
}
function gen() {
yield 1.23 => 123;
}
foo(...gen());
?>
Утилита ext_skel была полностью переработана с новыми опциями, а некоторые старые опции удалены. Теперь она написана на PHP и не имеет внешних зависимостей.
Поддержка BeOS была прекращена.
Исключения, выброшенные из-за автоматического преобразования предупреждений в исключения в режиме EH_THROW (например, некоторые исключения DateTime), больше не заполняют состояние error_get_last(). Таким образом, они теперь работают так же, как вручную выброшенные исключения.
Исключение TypeError теперь указывает на правильные типы int и bool вместо integer и boolean, соответственно.
Про неопределенные переменные, переданные в compact(), теперь будет сообщено уведомлением.
Функция getimagesize() и связанные с ней функции теперь сообщают mime-типы изображений BMP как image/bmp вместо image/x-ms-bmp, поскольку первый зарегистрирован в IANA (см. » RFC 7903).
Функция stream_socket_get_name() теперь возвращает адреса IPv6, заключенные в квадратные скобки. Например, будет возвращена строка "[::1]:1337" вместо "::1:1337".
Все предупреждения, выброшенные функциями BCMath, теперь используют обработку ошибок PHP. Раньше некоторые предупреждения были непосредственно отправлены в поток stderr.
Функции bcmul() и bcpow() теперь возвращают числа с запрошенным масштабом. Раньше возвращаемые числа могли опускать завершающие десятичные нули.
Логины rsh/ssh по умолчанию отключены. Используйте imap.enable_insecure_rsh, если вы хотите включить их. Обратите внимание, что библиотека IMAP не фильтрует имена почтовых ящиков перед передачей их команде rsh/ssh, таким образом, передача ненадежных данных этой функции с включенным rsh/ssh небезопасна.
Из-за дополнительной поддержки именованных фрагментов, паттерны mb_ereg_*() с использованием именованных фрагментов будут вести себя по-разному. В частности, именованные фрагменты будут частью совпадений, а mb_ereg_replace() будет интерпретировать дополнительный синтаксис. Смотрите Именованные фрагменты для получения дополнительной информации.
Подготовленные запросы теперь правильно указывают на дробные секунды для столбцов DATETIME, TIME и TIMESTAMP с указателем десятичных знаков (например, TIMESTAMP(6) при использовании микросекунд). Раньше часть дробных секунд была просто опущена из возвращаемых значений.
Подготовленные запросы теперь правильно указывают на дробные секунды для столбцов
DATETIME, TIME и
TIMESTAMP со спецификатором десятичных знаков
(например, TIMESTAMP(6) при использовании микросекунд).
Ранее, дробная часть секунд была просто опущена из возвращаемых значений.
Обратите внимание, что это влияет только на использование PDO_MYSQL с отключенной эмуляцией подготовленных запросов
(например, с использованием нативной функциональности).
Запросы, использующие соединения, у которых задана опция PDO::ATTR_EMULATE_PREPARES
=TRUE
(значение по умолчанию), не были затронуты данным исправлением ошибки и уже получали корректные значения долей секунды от движка.
Экспорт объектов Reflection в строку теперь использует int) и bool) вместо integer and boolean, соответственно.
Если автозагрузчик SPL выбрасывает исключение, последующие автозагрузчики не будут выполняться. Раньше все автозагрузчики выполнялись, а исключения объединялись в цепочку вызовов.