Релиз языка программирования PHP 7.4
28 ноября 2019 года
После года разработки представлен релиз языка программирования 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 или 2nul в 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().
Источники
[править]
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
Комментарии[править]
Если вы хотите сообщить о проблеме в статье (например, фактическая ошибка и т. д.), пожалуйста, используйте обычную страницу обсуждения.
Комментарии на этой странице могут не соответствовать политике нейтральной точки зрения, однако, пожалуйста, придерживайтесь темы и попытайтесь избежать брани, оскорбительных или подстрекательных комментариев. Попробуйте написать такие комментарии, которые заставят задуматься, будут проницательными или спорными. Цивилизованная дискуссия и вежливый спор делают страницу комментариев дружелюбным местом. Пожалуйста, подумайте об этом.
Несколько советов по оформлению реплик:
- Новые темы начинайте, пожалуйста, снизу.
- Используйте символ звёздочки «*» в начале строки для начала новой темы. Далее пишите свой текст.
- Для ответа в начале строки укажите на одну звёздочку больше, чем в предыдущей реплике.
- Пожалуйста, подписывайте все свои сообщения, используя четыре тильды (~~~~). При предварительном просмотре и сохранении они будут автоматически заменены на ваше имя и дату.
Обращаем ваше внимание, что комментарии не предназначены для размещения ссылок на внешние ресурсы не по теме статьи, которые могут быть удалены или скрыты любым участником. Тем не менее, на странице комментариев вы можете сообщить о статьях в СМИ, которые ссылаются на эту заметку, а также о её обсуждении на сторонних ресурсах.