Реліз мови програмування PHP 7.4

Після року розробки представлений реліз мови програмування PHP 7.4. Нова гілка включає серію нових можливостей, а також кілька змін, що порушують сумісність.

Ключові поліпшення у PHP 7.4:

  • Типізовані властивості - властивості класів тепер можуть включати оголошення типів, наприклад:

    class User {
    public int $id;
    public string $name;
    }

  • Скорочений синтаксис визначення функцій "fn(parameter_list) => expr" з прив'язкою області видимості за значенням. Наприклад, "fn($x) => $x + $y" є аналогом "$fn2 = function ($x) use ($y) {return $x + $y;}");
  • Скорочений оператор присвоєння «??=», який може використовуватися для визначення значення за умовчанням («a ??= b» аналогічно «a = a ?? b», якщо «a» визначено його значення зберігається, а якщо не визначено присвоюється значення «b» );
  • Обмежена можливість збереження ієрархії успадкування типів у похідних від них типах значень, що повертаються, або можливість перетворення ієрархії вихідних типів на протилежну у похідних типах аргументів (підступність типу, що повертається і контраваріантність типу аргументів). У PHP тепер можна використовувати такі конструкції:

    class A {}
    class B extends A {}

    class Producer {
    public function method(): A {}
    }
    class ChildProducer extends Producer {
    public function method(): B {}
    }

  • Оператор розпакування всередині масивів «…$var», дозволяє виконувати підстановку існуючих масивів щодо нового масиву;

    $parts = ['apple', 'pear'];
    $fruits = ['banana', 'orange', …$parts, 'watermelon'];
    // ['banana', 'orange', 'apple', 'pear', 'watermelon'];

  • Можливість наочного оформлення великих чисел із роздільниками у числових літералах (1_000_000_00);
  • Підтримка слабких посилань, що дозволяють зберегти посилання на об'єкт, але не блокують видалення пов'язаного об'єкта збирачем сміття;
  • Новий механізм серіалізації об'єктів (комбінація Serializable та __sleep()/__wakeup()), що прийшов на зміну інтерфейсу Serializable, який буде оголошений застарілим;

    // Повертає масив, що містить усі стани об'єкта;
    public function __serialize(): array;

    // Відновлює стан об'єкта з масиву
    public function __unserialize(array $data): void;

  • Дозволено генерацію винятків з методу __toString();
  • Додано підтримку запобіжного завантаження кешу об'єктного коду. Для налаштування додано параметр
    opcache.preload, через який можна вказати PHP-скрипт, який буде скомпільовано та запущено під час запуску сервера. Даний скрипт може завантажити опкод інших файлів через їхнє пряме включення або за допомогою функції opcache_compile_file();

  • До розширення Hash додано функцію crc32c для обчислення контрольних сум з використанням полінома Кастаньолі;
  • У функцію password_hash() додано підтримку методів хешування паролів argon2i та argin2id, в реалізації бібліотеки Sodium, якщо PHP збирається без libargon;
  • Додано функцію mb_str_split(), аналогічну str_split(), але оперує не байтами а позиціями символів у багатобайтовому рядку;
  • У функції strip_tags() додано можливість передачі масиву з іменами тегів, тобто. замість strip_tags($str, ' ') тепер можна вказати strip_tags($str, ['a', 'p']);
  • У proc_open() дозволено перерахування операндів у масиві, замість зазначення рядка для запуску, а також реалізовано можливість перенаправлення потоків та підтримка нульового файлового дескриптора;

    proc_open(['php', '-r', 'echo Hello World\n';'], $descriptors, $pipes);

    // Як 2>&1 в shell
    proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['redirect', 1]], $pipes);

    // як 2>/dev/null або 2>nul в shell
    proc_open($cmd, [1 => ['pipe', 'w'], 2 => ['null']], $pipes);

  • З базової поставки виключені розширення Firebird/Interbase, Recode та WDDX. Дані розширення тепер поширюються через PECL;
  • Переведені в розряд застарілих такі можливості, як вкладені тернарні оператори без дужок, звернення до елементів масивів та рядків з використанням фігурних дужок ($var{$idx}), функція is_real() і приведення до типу real, використання ключового слова parent без батьківського класу, параметр конфігурації allow_url_include, застосування array_key_exists() над об'єктами.

    Оголошено застарілі функції get_magic_quotes_gpc(), get_magic_quotes_runtime(),
    hebrevc(), convert_cyr_string(), money_format(), ezmlm_hash(), restore_include_path(), ldap_control_paged_result_response(), ldap_control_paged_result(), ReflectionType::__toString().

    Забезпечено виведення попередження про застосування застарілої можливості при спробі обробки некоректних символів у функціях
    base_convert(), bindec(), octdec() і hexdec(), а також при вказівці нерядкового шаблону в mb_ereg_replace().

Джерело: opennet.ru

Додати коментар або відгук