Другие изменения

Улучшения производительности

Ядро PHP

Добавлен специальный опкод виртуальной машины для функции array_key_exists(), который улучшает производительность этой функции, если значение параметра может быть статически разрешено. В коде, использующем пространства имён, возможно потребуется использование абсолютного имени (\array_key_exists()) либо же явный импорт функции.

Регулярные выражения (совместимые с Perl)

Когда функция preg_match() в режиме UTF-8 (модификатор "u") неоднократно вызывается для одной и той же строки (возможно, на различных позициях), проверка правильности UTF-8 будет выполнена только один раз.

Изменения обработки INI-файлов

zend.exception_ignore_args - новая INI-директива для включения или исключения аргументов из трассировок стека, полученных в исключениях.

opcache.preload_user - новая INI-директива для установки пользователя, из-под которого должен выполняться код предварительной загрузки, иначе это будет root (не допускается по соображениям безопасности).

Миграция на pkg-config

Множество модулей теперь используют исключительно pkg-config, чтобы определять зависимости библиотек. Как правило, это означает, что вместо --with-foo-dir=DIR используется только --with-foo. Пользовательские пути к библиотекам могут быть указаны либо путём добавления дополнительных каталогов в PKG_CONFIG_PATH, либо путём явного указания параметров компиляции через FOO_CFLAGS и FOO_LIBS.

Следующие модули и SAPI были затронуты этим изменением:

  • CURL:
    • Опция --with-curl больше не принимает каталог.
  • Enchant:
    • Опция --with-enchant больше не принимает каталог.
  • FPM:
    • Опция --with-fpm-systemd теперь использует только pkg-config для проверок libsystem. Минимальная обязательная версия libsystemd - 209.
  • GD:
    • Опция --with-gd переименована в --enable-gd (должен быть включён модуль или нет), а опция --with-external-gd использует внешнюю библиотеку libgd, вместо той, которая идёт в комплекте.
    • Опция --with-png-dir удалена. Наличие libpng теперь обязательно.
    • Опция --with-zlib-dir удалена. Наличие zlib теперь обязательно.
    • Опция --with-freetype-dir переименована в --with-freetype
    • Опция --with-jpeg-dir переименована в --with-jpeg
    • Опция --with-webp-dir переименована в --with-webp
    • Опция --with-xpm-dir переименована в --with-xpm
  • IMAP:
    • Опция --with-kerberos-systemd больше не принимает каталог.
  • Intl:
    • Опция --with-icu-dir удалена. Если передан --enable-intl, тогда всегда требуется наличие libicu.
  • LDAP:
    • Опция --with-ldap-sasl больше не принимает каталог.
  • Libxml:
    • Опция --with-libxml-dir удалена.
    • Опция --enable-libxml переименована в --with-libxml.
    • Опция --with-libexpat-dir переименована в --with-expat и больше не принимает каталог.
  • Litespeed:
    • Опция --with-litespeed переименована в --enable-litespeed.
  • Mbstring:
    • Опция --with-onig удалена. Если --disable-mbregex не указан, требуется libonig.
  • ODBC:
    • Опция --with-iodbc больше не принимает каталог.
    • Опция --with-unixODBC без каталога теперь использует pkg-config (предпочтительно). Каталог по-прежнему можно указать для старых версий без libodbc.pc.
  • OpenSSL:
    • Опция --with-openssl больше не принимает каталог.
  • PCRE:
    • Опция --with-pcre-regex удалена. Вместо этого --with-external-pcre позволяет использовать внешнюю PCRE-библиотеку вместо встроенной.
  • PDO_SQLite:
    • Опция --with-pdo-sqlite больше не принимает каталог.
  • Readline:
    • Опция --with-libedit больше не принимает каталог.
  • Sodium:
    • Опция --with-sodium больше не принимает каталог.
  • SQLite3:
    • Опция --with-sqlite3 больше не принимает каталог.
  • XSL:
    • Опция --with-xsl больше не принимает каталог.
  • Zip:
    • Опция --with-libzip удалена.
    • Опция --enable-zip переименована в --with-zip.

Экранирование CSV

fputcsv(), fgetcsv(), SplFileObject::fputcsv(), SplFileObject::fgetcsv() и SplFileObject::setCsvControl() теперь принимаем пустую строку в аргументе $escape. Это отключит проприетарный механизм экранирования PHP.

Поведение функции str_getcsv() было соответствующим образом скорректировано (ранее пустая строка была идентична использованию значения по умолчанию).

Метод SplFileObject::getCsvControl() теперь также может возвращать пустую строку для третьего элемента массива, соответственно.

Фильтрация данных

Модуль filter больше не поддерживает ---with-pcre-dir для Unix-сборок и поэтому может быть спокойно собран для общего пользования с помощью ./configure.

GD

Поведение функции imagecropauto() в встроенной библиотеке libgd было синхронизировано с системной библиотекой libgd:

  • IMG_CROP_DEFAULT в случае неудачного выполнения не заменяется на IMG_CROP_SIDES
  • Пороговое значение кадрирования теперь рассчитывается из алгоритма в системной библиотеке libgd

Значение по умолчанию $mode imagecropauto() было изменено на IMG_CROP_DEFAULT; передача -1 теперь объявлена устаревшей.

imagescale() теперь поддерживает масштабирование с сохранением соотношения сторон до фиксированной высоты при передаче -1 в параметр $new_width.

Фреймворк хеш-кодов HASH

Модуль hash больше нельзя отключить, теперь он является неотъемлемой частью любой PHP-сборки, подобно модулю date.

Intl

Модуль intl теперь требует как минимум ICU 50.1.

Класс ResourceBundle теперь реализует Countable.

Облегчённый протокол доступа к каталогам (LDAP)

Поддержка nsldap и umich_ldap была удалена.

Libxml

Все модули на основе libxml теперь требуют libxml версии 2.7.6 или новее.

Многобайтовые строки

Библиотека oniguruma больше не идёт в комплекте с PHP, вместо неё в системе должна быть libonig. В качестве альтернативы можно указать ---disable-mbregex, чтобы отключить компонент mbregex.

OPcache

Конфигурационные опции --disable-opcache-file и --enable-opcache-file удалены в пользу использования INI-директивы opcache.file_cache

Хеширование паролей

Функции password_hash() и password_needs_rehash() теперь принимают обнуляемую строку (string) и целое число (int) в аргументе $algo.

PEAR

Установка PEAR (вместе с PECL) больше не включена по умолчанию. Её можно явно включить, используя --with-pear. Эта опция объявлена устаревшей и может быть удалена в будущем.

Reflection

Изменены числовые значения констант-модификаторов (IS_ABSTRACT, IS_DEPRECATED, IS_EXPLICIT_ABSTRACT, IS_FINAL, IS_IMPLICIT_ABSTRACT, IS_PRIVATE, IS_PROTECTED, IS_PUBLIC и IS_STATIC) в классах ReflectionClass, ReflectionFunction, ReflectionMethod, ReflectionObject и ReflectionProperty.

SimpleXML

Класс SimpleXMLElement теперь реализует Countable.

SQLite3

Встроенная в сборке библиотека libsqlite удалена. Для сборки модуля SQLite3 теперь требуется libsqlite3 ≥ 3.7.4. Чтобы собрать модуль PDO_SQLite обязательно требуется libsqlite3 ≥ 3.5.0.

Сериализация и десериализация SQLite3, SQLite3Stmt и SQLite3Result теперь явно запрещены. Раньше сериализация экземпляров этих классов была возможна, но десериализация делала объекты неиспользуемыми для дальнейшей работы.

Нотацию @param теперь также можно использовать для обозначения параметров SQL-запроса.

Zip

Встроенная библиотека libzip удалена. Теперь обязательно наличие в системе библиотеки libzip >= 0.11, чтобы собрать модуль zip.

add a note add a note

User Contributed Notes 3 notes

up
3
Florent H (Sowapps)
4 years ago
This version brings an important changes with the directive zend.exception_ignore_args set to On by default.
In all stack traces, the args key is now missing.
All php frameworks have to handle this to report errors & exceptions.
up
0
santi at mola dot io
4 years ago
Note for internals/extensions:

Many opcode values changed between PHP 7.3 and 7.4, so most documentation resources are outdated in that regard. You can look the definitions at Zend/zend_vm_opcodes.h in php-src. For example, ZEND_ECHO changes from 40 to 136.

While opcode changes happen in a lot of PHP versions, the change in 7.4 is quite significant.
up
0
ohcc at 163 dot com
4 years ago
As of PHP 7.4, an exception thrown within the user-defined shutdown function can be caught by the user-defined exception handler.

<?php
    set_error_handler
(
        function(
$level, $error, $file, $line){
            if(
0 === error_reporting()){
                return
false;
            }
            throw new
ErrorException($error, -1, $level, $file, $line);
        },
       
E_ALL
   
);

   
register_shutdown_function(function(){
       
$error = error_get_last();
        if(
$error){
            throw new
ErrorException($error['message'], -1, $error['type'], $error['file'], $error['line']);
        }
    });

   
set_exception_handler(function($exception){
       
// ... more code ...
   
});  
  
    require
'NotExists.php';
To Top