Релиз языка программирования 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, '‹a›‹p›') теперь можно указать 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 ().



Источник: http://www.opennet.ru/opennews/art.shtml? num=51944

© OpenNet