Изменения в PHP7
Изменения не совместимые со старыми версиями
Изменения языка
Изменения по работе с переменными
- Ссылки на непрямые переменные, свойства и методы теперь интерпретируются слева-направо. Несколько примеров:
$$foo['bar']['baz'] // интерпретируется как ($$foo)['bar']['baz'] $foo->$bar['baz'] // интерпретируется как ($foo->$bar)['baz'] $foo->$bar['baz']() // интерпретируется как ($foo->$bar)['baz']() Foo::$bar['baz']() // интерпретируется как (Foo::$bar)['baz']()
Для восстановления предыдущего поведения добавьте явные фигурные скобки:
${$foo['bar']['baz']} $foo->{$bar['baz']} $foo->{$bar['baz']}() Foo::{$bar['baz']}()
- Ключевое слово global теперь принимает только простые переменные. Вместо
global $$foo->bar;
теперь нужно писать так:
global ${$foo->bar};
- Скобки вокруг переменных или вызовов функций больше не имеют какого либо влияния на их поведение. Например, следующий код, где результат вызова функции передаётся функции по ссылке
function getArray() { return [1, 2, 3]; } $last = array_pop(getArray()); // Строгий стандарт: Только переменные должны быть переданы по ссылке $last = array_pop((getArray())); // Строгий стандарт: Только переменные должны быть переданы по ссылке
теперь будет вызывать ошибку строгих стандартов, где бы не использовались скобки. Раньше для второго случая не генерировалось предупреждение.
- Элементы массива или свойства объекта, которые создаются автоматически во время назначения по ссылке, теперь будут в ином порядке в результатах. Например
$array = []; $array["a"] =& $array["b"]; $array["b"] = 1; var_dump($array);
теперь результатом будет массив [«a» => 1, «b» => 1], в то время как раньше результатом было [«b» => 1, «a» => 1];
Связанные RFC:
https://wiki.php.net/rfc/uniform_variable_syntax
https://wiki.php.net/rfc/abstract_syntax_tree
Изменения для list()
- list() больше не будет назначать переменные в обратном порядке. Например
list($array[], $array[], $array[]) = [1, 2, 3]; var_dump($array);
теперь результатом будет $array == [1, 2, 3] вместо [3, 2, 1]. Обратите внимание, что изменился только порядок назначения, но назначенные значения остаются прежними. Например, нормальное использование вроде
list($a, $b, $c) = [1, 2, 3]; // $a = 1; $b = 2; $c = 3;
сохранит текущее поведение.
- Больше неразрешено назначение пустого list(). Таким образом, все последующие примеры неверны:
list() = $a; list(,,) = $a; list($x, list(), $y) = $a;
- list() больше не поддерживает распакованных строк (хотя раньше они поддерживались в некоторых случаях). Код
$string = "xy"; list($x, $y) = $string;
теперь будет иметь результат $x == null и $y == null (без замечаний) вместо $x == "x" и $y == "y". Кроме того, list() теперь гарантированно работает с объектами реализации ArrayAccess, например.
list($a, $b) = (object) new ArrayObject([0, 1]);
теперь будет иметь результат $a == 0 и $b == 1. Раньше обе $a и $b были null.
Связанные RFC:
https://wiki.php.net/rfc/abstract_syntax_tree#changes_to_list
https://wiki.php.net/rfc/fix_list_behavior_inconsistency
Изменения для foreach
Итерации с foreach() больше не оказывают какого-либо эффекта на внутренний указатель массива, которые может быть затронут через функции из рода current()/next()/и т.д. Например
$array = [0, 1, 2]; foreach ($array as &$val) { var_dump(current($array)); }
теперь напечатает значение int(0) три раза. Раньше вывод был int(1), int(2) и bool(false).
- Когда итерируется массив по величине, foreach теперь всегда будет оперировать с копией массива, таким образом, изменения массива во время итераций не окажут влияния на итерационное поведение. Например
$array = [0, 1, 2]; $ref =& $array; // Необходимо вызвать старое поведение foreach ($array as $val) { var_dump($val); unset($array[1]); }
теперь напечатает все три элемента (0 1 2), а раньше второй элемент 1 пропускался (0 2).
- Когда итерируется массив по ссылки, модификации к массиву будут продолжать оказывать влияние на итерацию. Тем не менее, теперь в ряде случаев PHP будет выполнять работу лучше по поддержанию верной позиции. Например, добавленный к массиву во время итерации по ссылке
$array = [0]; foreach ($array as &$val) { var_dump($val); $array[1] = 1; }
теперь также будет перебирать и добавленный элемент. Следовательно вывод этого примера будет "int(0) int(1)", в то время как раньше вывод был только "int(0)".
- Перебор простых (non-Traversable) объектов по значению или по ссылке будет вести себя как перебор массивов по ссылке. Это соответствует предыдущему поведению помимо более точному управлению позиции, упомянутой в предыдущем пункте.
Перебор Traversable объектов остаётся неизменным.
Связанная RFC: https://wiki.php.net/rfc/php7_foreach
Изменения в обработке параметра
- Больше невозможно задать два параметра функции с одинаковым именем. Например, следующий метод вызовет ошибку во время компиляции:
public function foo($a, $b, $unused, $unused) { // ... }
Код вроде этого должен быть изменён для использования отдельных имён параметров, например:
public function foo($a, $b, $unused1, $unused2) { // ... }
- Функции func_get_arg() и func_get_args() больше не возвращают первоначальное значение, которое было передано в параметр и вместо этого будут предоставлять текущую величину (которая могла и измениться). Например
function foo($x) { $x++; var_dump(func_get_arg(0)); } foo(1);
теперь будет печатать "2" вместо "1". Этот код должен быть изменён для выполнении модификаций после вызова func_get_arg(s)
function foo($x) { var_dump(func_get_arg(0)); $x++; }
или полностью избежать изменения параметров:
function foo($x) { $newX = $x + 1; var_dump(func_get_arg(0)); }
- Аналогично исключение цепочек вызова больше не будет отображать первоначальное значение, которое было передано в функцию, а показывать вместо него изменённое значение. Например
function foo($x) { $x = 42; throw new Exception; } foo("string");
теперь приведёт к результату в трассировке стека:
Stack trace: #0 file.php(4): foo(42) #1 {main}
а раньше было так:
Stack trace: #0 file.php(4): foo('string') #1 {main}
Хотя это не должно оказать влияние на поведение вашего кода при выполнении, полезно знать об этой разнице для целей отладки.
Такое же ограничение распространяется также на debug_backtrace() и другие функции, контролирующие аргументы функций..
Связанные RFC: https://wiki.php.net/phpng
Изменения в обработке целых чисел
- Невалидные восьмеричные литералы (содержащие цифры больше 7) теперь вызывают ошибку компилятора. Например, следующее больше невалидно:
$i = 0781; // 8 невалидное восьмеричное число!
Раньше невалидные восьмеричные (и любые следующие валидные цифры) просто игнорировались. Раньше бы $i имел значение 7, поскольку последние две цифры были бы молча отброшены.
- Битовые сдвиги отрицательных чисел теперь выбросят ArithmeticError:
var_dump(1 >> -1); // ArithmeticError: Bit shift by negative number
- Левый битовый сдвиг числа бита за пределами ширины бита целого числа всегда будет приводить к результату 0:
var_dump(1 << 64); // int(0)
Раньше поведение этого кода зависло от используемой архитектуры CPU. Например, на x86 (включая x86-64) результат был int(1),, поскольку сдвиг операнда был обёрнут.
- Подобным образом правый битовый сдвиг на число бит за пределами шитовой ширины целого числа всегда будет приводить к результату 0 или -1 (в зависимости от знака):
var_dump(1 >> 64); // int(0) var_dump(-1 >> 64); // int(-1)
Связанные RFC: https://wiki.php.net/rfc/integer_semantics
Изменения в обработке строк
Строки, которые содержат шестнадцатеричные числа, больше не рассматриваются как числовые и больше не получают специальной обработки. Несколько примеров нового поведения:
var_dump("0x123" == "291"); // bool(false) (раньше true) var_dump(is_numeric("0x123")); // bool(false) (раньше true) var_dump("0xe" + "0x1"); // int(0) (раньше 16) var_dump(substr("foo", "0x1")); // string(3) "foo" (раньше "oo") // Примечание: встретилось не хорошо сформированое числовое значение
filter_var() может быть использован для проверки, содержит ли строка шестнадцатеричное число или конвертирует такую строку в целочисленное число:
$str = "0xffff"; $int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX); if (false === $int) { throw new Exception("Invalid integer!"); } var_dump($int); // int(65535)
- Благодаря дополнению в Unicode Codepoint Escape Syntax для строк в двойных кавычках и встроенных документах, "u{", после которой следуют невалидная последовательность, вызовет ошибку:
$str = "u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence
Для избежания этого нужно экранировать первый слэш:
$str = "\u{xyz}"; // Работает нормально
Тем не менее, "u" без последующей { не затронуты. Таким образом, следующий код не приведёт к ошибке и будет прекрасно работать как и раньше:
$str = "u202e"; // Работает прекрасно
Связанные RFC:
* https://wiki.php.net/rfc/remove_hex_support_in_numeric_strings
* https://wiki.php.net/rfc/unicode_escape
Изменения в обработке ошибок
- Теперь есть два класса исключений: Exception и Error. Оба класса реализуют новый интерфейс Throwable. Типы подсказок в коде обработки исключений, возможно, придётся изменить, чтобы учесть это.
- Некоторые фатальные ошибки и восстанавливаемые фатальные ошибки теперь выбрасывают Error. Error — это отдельный от Exception класс, эти исключение не будут ловиться существующими блоками try/catch.
Для восстанавливаемых фатальных ошибок, которые были преобразованы в исключения, больше невозможно молча игнорировать ошибку от обработчика ошибок. В особенности больше невозможно игнорировать ошибки с type.
- Ошибки парсера теперь генерируют ParseError, которые наследует Error. Обработка ошибок для eval() на потенциально невалидном коде должан быть изменена на перехват ParseError в дополнение к предыдущей возвращаемой величине / error_get_last() на основе обращения.
- Конструкторы внутренних классов всегда будут выбрасывать исключение в случае неудачи. Раньше некоторые конструкторы возвращали NULL или неиспользуемый объект.
- Уровень ошибок некоторых предупреждений E_STRICT был изменён.
Связанные RFC:
https://wiki.php.net/rfc/engine_exceptions_for_php7
https://wiki.php.net/rfc/throwable-interface
https://wiki.php.net/rfc/internal_constructor_behaviour
https://wiki.php.net/rfc/reclassify_e_strict
Другие изменения в языке
- Удалена поддержка формирования несовместимого контекста this для статичных вызовов к нестатичным вызовам.
class A { public function test() { var_dump($this); } } // Обратите внимание: НЕ наследует Aclass B { public function callNonStaticMethodOfA() { A::test(); } } (new B)->callNonStaticMethodOfA(); // Deprecated: Non-static method A::test() should not be called statically // Notice: Undefined variable $this NULL
Обратите внимание, что это только применимо к вызовам из несовместимого контекста. В классе B, наследующем от A, вызов должен быть позволен без каких либо замечаний.
- Больше невозможно использовать следующие имена классов, интерфейсов и траэйтов (без учёта регистра):
bool int float string null false true
Это применимо к объявлению класса/интерфейса/трэйта, class_alias() и использованию утверждений.
Более того, следующие имена класса, интерфейса и трэйта зарезервированы для будущего использования, но ещё не приводят к ошибке во время использования:
resource object mixed numeric
- Конструкции языка yield больше не требуют круглых скобок когда используются в контекстных выражения. Теперь правоассоциативной оператор с приоритетом между "печать" и оператором "=>. Это может приводить к различному поведению в различных случаях, например:
echo yield -1; // Раньше интерпретировалось как echo (yield) - 1; // А теперь интерпретируется как echo yield (-1); yield $foo or die; // Раньше интерпретировалось как yield ($foo or die); // А теперь это интерпретируется как (yield $foo) or die;
Такие случае всегда могут быть разрешены добавлением дополнительных скобок.
- Удаление тегов ASP (<%) и script (). (RFC: https://wiki.php.net/rfc/remove_alternative_php_tags)
- Удалена поддержка присвоения результата new по ссылке.
- Убрана поддержка вызовов с заданной областью не статичных методов для несовместимого контекста $this. Смотрите подробности в https://wiki.php.net/rfc/incompat_ctx.
- Удаление поддержки комментариев # в файлах ini. Используйте для комментариев ; вместо них.
- $HTTP_RAW_POST_DATA больше не доступна. Используйте вместо поток php://input.
Изменения в стандартных библиотеках
- call_user_method() и call_user_method_array() больше не существуют.
- ob_start() больше не выводит E_ERROR, но вместо него E_RECOVERABLE_ERROR в случае создания выводного буфера в обработчике выводного буфера.
- Улучшен zend_qsort (используется алгоритм гибридной сортировки) для лучшей производительности, также переименован zend_qsort в zend_sort.
- Добавлен стабильный алгоритм сортировки zend_insert_sort.
- Удалена функция dl() на fpm-fcgi.
- setcookie() с пустым именем кукиз теперь вызывают WARNING (предупреждение) и больше не отправляют пустую строку заголовка set-cookie.
Другое
Curl:
- Удалена поддержка для отключающей опции CURLOPT_SAFE_UPLOAD. Все загружаемые curl файлы должны использовать curl_file / CURLFile API.
Дата:
- Удалён параметр $is_dst из mktime() и gmmktime().
DBA
- dba_delete() теперь возвращает false если ключ также не был найден в обработчике ini файла.
GMP
- Теперь требуется libgmp версии 4.2 или новее.
- gmp_setbit() и gmp_clrbit() теперь возвращают FALSE для отрицательных индексов, далая их последовательными с другими функциями GMP.
Intl:
- Удалены устаревшие псевдонимы datefmt_set_timezone_id() и IntlDateFormatter::setTimeZoneID(). Используйте вместо них datefmt_set_timezone() и IntlDateFormatter::setTimeZone().
libxml:
- Добавлена опция парсинга LIBXML_BIGLINES. Она доступна начиная с libxml 2.9.0 и добавляет поддержку для номеров строк >16-бит в отчётах об ошибках.
Mcrypt
- Удаление устаревших псевдонимов mcrypt_generic_end() в пользу mcrypt_generic_deinit().
- Удаление устаревших функций mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() и mcrypt_ofb() в пользу mcrypt_encrypt() и mcrypt_decrypt() с флагом MCRYPT_MODE_*.
Сессия
- session_start() принимает все настройки INI settings как массив, например, [‘cache_limiter’=>’private’] устанавливает session.cache_limiter=private. Она также поддерживает 'read_and_close', которая закрывает сессионные данные немедленно после чтения данных.
- Сохранение обработчиков accepts validate_sid(), update_timestamp(), которые валидируют существование ID сессии, обновляют метку времени сессионных данных. Совместимость со старыми определёнными пользователями обработчиками сохранения оставлена.
- Добавлен SessionUpdateTimestampHandlerInterface. validateSid(), updateTimestamp() определены в этом интерфейсе.
- session.lazy_write(default=On) настрока INI включает запись данных сессии только когда данные сессии обновляются.
Opcache
- Удалена конфигурационная директива opcache.load_comments. Сейчас загрузка комментариев doc ничего не делает и всегда включена.
OpenSSL:
- Удаление контекстной опции SSL "rsa_key_size" в пользу автоматических настроек надлежащего размера, заданного согласованным криптографическим алгоритмом.
- Удалены контекстные опции SSL "CN_match" и "SNI_server_name". Используйте вместо неё автоматическое определение или опцию "peer_name".
PCRE:
- Удалена поддержка для модификатора /e (PREG_REPLACE_EVAL). Используйте вместо него preg_replace_callback().
PDO_pgsql:
- Удалён атрибует PGSQL_ATTR_DISABLE_NATIVE_PREPARED_STATEMENT в пользу ATTR_EMULATE_PREPARES.
Стандартные:
- Удалена поддержка строковых категорий в etlocale(). Используйте вместо неё константы LC_*.
- Удалена set_magic_quotes_runtime() и её псевдоним magic_quotes_runtime().
JSON:
- Отклонён несовместимый формат номеров RFC 7159 в строке json_decode — верхний уровень (07, 0xff, .1, -.1) и все уровни ([1.], [1.e1])
- Вызов json_decode с первым аргументом равным PHP строке или величине, которая при приведении к строке является пустой строкой (NULL, FALSE) приводит к результату ошибка синтаксиса JSON.
Поток:
- Удаление set_socket_blocking() в пользу его псевдонима stream_set_blocking().
XSL:
- Удалена ini опция xsl.security_prefs. Используйте вместо неё XsltProcessor::setSecurityPrefs().
2. Новые особенности
Ядро
- Добавлено групповое использование объявлений. (RFC: https://wiki.php.net/rfc/group_use_declarations)
- Добавлен объединяющий оператор null (??). (RFC: https://wiki.php.net/rfc/isset_ternary)
- Поддержка строк с длинной >= 2^31 байт в 64-битных сборках.
- Добавлен метод Closure::call() (работает только с классами пользовательского пространства).
- Добавлен синтаксис u{xxxxxx} Unicode Codepoint Escape для строк в двойных кавычках и встроенных документах.
- define() теперь поддерживает массивы как константные величины, фиксит контроль, где define() до сих пор не поддерживает синтаксис констант.
- Добавлен оператор сравнения (<=>), также известный как оператор «космический корабль». (RFC: https://wiki.php.net/rfc/combined-comparison-operator)
- Добавлен yield из оператора для делегирования сопрограмм вроде Генераторов (Generators). (RFC: https://wiki.php.net/rfc/generator-delegation)
- Зарезервированные ключевые слова теперь могут быть использованы в различных новых контекстах. (RFC: https://wiki.php.net/rfc/context_sensitive_lexer)
- Добавлена поддержка для скалярных объявлений и строго режима объявления с использованием (strict_types=1) (RFC: https://wiki.php.net/rfc/scalar_type_hints_v5)
- Добавлена поддержка для криптографически безопасного языка пользователя RNG (RFC: https://wiki.php.net/rfc/easy_userland_csprng)
Opcache
- Добавлен кэш опкода второго уровня, основанного на файлах (экспериментально — отключено по умолчанию). Для его включения, PHP должен быть настроен и собран с —enable-opcache-file, затем конфигурационная директива opcache.file_cache=<DIR> должна быть помещена в php.ini. Кэш второго уровня может увеличить производительность при перезапуске сервера или сброса SHM. Вдобавок возможно использовать файловый кэш совсем без SHM, используя opcache.file_cache_only=1 (это может быть полезно для общего хостинга) и отключение проверки соответствия файлового кэша для ускорения загрузки в ущерб безопасности, используя opcache.file_cache_consistency_checks=0.
OpenSSL
- Добавлена контекстная опция "alpn_protocols" SSL, позволяющая шифровать потоки клиент/сервер для согласования альтернативных протоколов, использующих расширение ALPN TLS, когда собраны с OpenSSL 1.0.2 или новее. Информация о согласованных протоколов принимается через вывод stream_get_meta_data().
Reflection
- Добавлен класс ReflectionGenerator (yield из Traces, текущего файла/строки и т.д.)
- Добавлен класс ReflectionType для улучшенной поддержки объявлений функций новых типов и скалярных типов. Новые методы ReflectionParameter::getType() и ReflectionFunctionAbstract::getReturnType() оба возвращают экземпляр ReflectionType.
Поток:
- Только для Windows была добавлена новая контекстная опция потока, позволяющая блокировать чтения по трубам. Для её включения используйте array("pipe" => array("blocking" => true)), когда создаёте потоковый контекст. Знайте, что эта опция при определённых обстоятельствах может стать причиной мёртвого запирания на буфере трубы. Тем не менее, она может быть полезной в некоторых сценариях CLI.
3. Изменения в модулях SAPI
FPM
- Исправлена ошибка #65933 (Не может определить конфигурационные строки длиннее 1024 байт).
- Listen = port теперь прослушивает на всех адресах (IPv6 и IPv4-mapped).
4. Устаревшая функциональность
Ядро
- Конструкции в стиле PHP 4, когда имя конструктора точно такое же как и имя класса, теперь устарели.
- Статические вызовы к нестатическим методам теперь устарели.
OpenSSL
- Контекстная опция SSL "capture_session_meta" теперь устаревшая. Мета данные, касающиеся активного криптоалгоритма на потоке источника, теперь принимается через возвращаемый результат из from stream_get_meta_data().
5. Изменённые функции
parse_ini_file():
parse_ini_string():
- Добавлен режим сканера INI_SCANNER_TYPED для набранных yield .ini значений.
unserialize():
- Добавлен второй параметр для функции десериализации (RFC: https://wiki.php.net/rfc/secure_unserialize) позволяющие определить принимаемые классы: unserialize($foo, [«allowed_classes» => [«MyClass», «MyClass2»]]);
proc_open():
- Максимальное количество труб, используемое proc_open(), раньше было ограничено жёстко заданным значением 16. Это ограничение теперь убрано и количество труб фактически ограничено количеством доступной для PHP памяти.
- Только для Windows, новая опция "blocking_pipes" может быть использована для принудительной блокировки чтения на дочерних трубах процесса. Это охватывает несколько крайних случаев использования CLI, тем не менее, это может вести к мёртвым запираниям. Также это коррелирует с новыми контекстными опциями потока для труб.
array_column():
- Эта функция теперь поддерживает массив объектов, а также двухмерные массивы. Рассматриваются только публичные свойства, а объекты, которые используют _get() для динамических свойств, должны также реализовывать __isset().
stream_context_create()
- Теперь она принимает только конфигурацию Windows array("pipe" => array("blocking" => <boolean>)), что принудительно блокирует чтение на трубах. Эта опция должна использоваться осторожно, поскольку из-за ограничения этой платформы, возможны мёртвые запирания на буферах труб.
6. Новые функции
GMP
- Добавлена Added gmp_random_seed().
PCRE:
- Добавлена функция preg_replace_callback_array
(RFC: https://wiki.php.net/rfc/preg_replace_callback_array)
Стандартные:
- Добавлена функция intdiv() для целочисленного деления.
- Добавлена функция error_clear_last() для сброса статуса ошибок.
Zlib:
- Добавлены функции deflate_init(), deflate_add(), inflate_init(), inflate_add(), позволяющие инкрементное/потоковое сжатие/декомпрессию.
7. Новые классы и интерфейсы
8. Удалённые расширения и SAPI
- sapi/aolserver
- sapi/apache
- sapi/apache_hooks
- sapi/apache2filter
- sapi/caudium
- sapi/continuity
- sapi/isapi
- sapi/milter
- sapi/nsapi
- sapi/phttpd
- sapi/pi3web
- sapi/roxen
- sapi/thttpd
- sapi/tux
- sapi/webjames
- ext/mssql
- ext/mysql
- ext/sybase_ct
- ext/ereg
Для дополнительных подробностей смотрите
https://wiki.php.net/rfc/removal_of_dead_sapis_and_exts
https://wiki.php.net/rfc/remove_deprecated_functionality_in_php7
ВНИМАНИЕ: по поводу NSAPI не голосовали в RFC, тем не менее, она была удалена. Это также означает, что соответствующий SDK больше недоступен.
9. Другие изменения в расширениях
Mhash
- Mhash больше не является расширением, используйте функцию function_exists("mhash") для проверки, доступен ли он.
GD
- Комплект libgd требует libwebp вместо libvpx для функциональности WebP.
10. Новые глобальные константы
Ядро
- Добавлена PHP_INT_MIN.
Zlib
- Эти константы добавлены для контроля поведения стирания с новыми инкрементными функциями deflate_add() и inflate_add():
- ZLIB_NO_FLUSH
- ZLIB_PARTIAL_FLUSH
- ZLIB_SYNC_FLUSH
- ZLIB_FULL_FLUSH
- ZLIB_BLOCK
- ZLIB_FINISH
GD
- Поддержка T1Lib удалена, причиной этому стало появление новой зависимости для T1Lib. Следовательно, следующее больше недоступно:
Функции:
- imagepsbbox()
- imagepsencodefont()
- imagepsextendedfont()
- imagepsfreefont()
- imagepsloadfont()
- imagepsslantfont()
- imagepstext()
Ресурсы:
- 'шрифт gd PS'
- 'кодировка gd PS'
11. Изменение в работе файла INI
Ядро
- Удалена ini директива asp_tags. Попытка её включить вызовет фатальную ошибку.
- Удалена ini директива always_populate_raw_post_data.
12. Поддержка Windows
Ядро
- Поддержка нативных 64-битных чисел в 64-битных сборках.
- Поддержка огромных файлов в 64-битных сборках.
- Поддержка для getrusage()
ftp
- Расширение ftp теперь всегда поставляется совместно
- Для поддержки SSL была упразднена зависимость расширения openssl. Теперь поддержка SSL зависит только от библиотеки openssl. Если она присутствует во время компиляции, ftp_ssl_connect() включается автоматически.
odbc
- Расширение odbc всегда поставляется совместно
13. Другие изменения
Ядро
- Вместо того, чтобы быть неопределёнными и платформозависимыми, NaN и Infinity теперь всегда будут нулём, когда они применяются в роли целого числа.
- Вызов метода не-объекта теперь вызывает перехватываемую ошибку вместо фатальной ошибки, смотрите https://wiki.php.net/rfc/catchable-call-to-member-...
- Сообщения об ошибках zend_parse_parameters, нюансы с типами и приобразованиями теперь всегда говорят "integer" и "float" вместо "long" и "double".
- Вывод буферизации теперь продолжает работу для прерванного соединения, если опция ignore_user_abort установлена в true.