Найти в Дзене

Что изменится с релизом PHP 7.4?

19-ого сентября свет увидела RC2 -версия одного из самых популярных языков программирования в сфере веб-разработки - PHP. Всего планируется около шести подобных версий для стабилизации. Уже сейчас можно попробовать новые фичи, которые появились в данной версии языка. Релиз RC3 версии назначен на 3 октября, официальная версия появится уже 28 ноября 2019 года.

Новая версия PHP хоть и является минорной, но уже несёт множество новых, без преувеличения, крутых возможностей как для синтаксиса языка, так и для его производительности.

Ключевые изменения грядущей версии:

  • Стрелочные функции для короткой записи анонимных функций
  • Типизированные свойства классов
  • Присваивающий оператор объединения с null (??=)
  • Оператор распаковки в массивах
  • Интерфейс внешних функций, открывающий новые возможности для разработки расширений на PHP
  • Предзагрузка для улучшения производительности
  • Ковариантность/контравариантность в сигнатурах унаследованных методов

Стрелочные функции позволяют делать более короткую запись анонимных функций:

array_map(function (User $user) {
   return $user->id;
}, $users)

array_map(fn(User $user) => $user->id, $users)

Некоторые особенности принятой реализации стрелочных функций:

  • Они могут получить доступ к parent области, таким образом, нет необходимости использовать ключевое слово use.
  • $this тоже доступна, как и в обычных анонимных функциях.
  • Стрелочные функции могут содержать только одну строку, которая также является оператором возврата значения.

Свойства класса теперь смогут иметь type hint. Это очень долгожданное со времён PHP 7 изменение в направлении более строгой типизации языка. Теперь у нас есть все основные возможности для строгой типизации. Для типизации доступны все типы, за исключением  void и callable.

class Bar
{
   public string $name;
   public ?int $amount;
   public Foo $foo;
}

Вместо такой длинной записи:

$data['date'] = $data['date'] ?? new DateTime();

Теперь можно будет написать так:

$data['date'] ??= new DateTime();

Теперь можно использовать оператор распаковки в массивах (только неассоциативных):

$arrayA = [1, 2, 3];
$arrayB = [4, 5];
$result = [0, ...$arrayA, ...$arrayB, 6 ,7];
<i>// [0, 1, 2, 3, 4, 5, 6, 7]</i>

Интерфейс внешних функций (FFI) позволяет писать код на C непосредственно в PHP-коде. Это означает, что расширения PHP могут быть написаны на чистом PHP.

Предварительная загрузка — потрясающее дополнение к ядру PHP, которое должно привести к некоторым значительным улучшениям производительности (часть информации "запоминается"). Повышение производительности происходит "небесплатно" — если предварительно загруженные файлы изменяются, сервер должен быть перезапущен.

В настоящее время PHP имеет в основном инвариантные типы параметров и инвариантные возвращаемые типы. Данное изменение позволяет изменять тип параметра на один из его супертипов. В свою очередь возвращаемый тип можно заменить на его подтип. Таким образом, данное изменение позволит более строго следовать принципу подстановки Барбары Лисков.

Пример использования ковариантного возвращаемого типа:

interface Factory {
   function make(): object;
}
class UserFactory implements Factory {
   function make(): User;
}

и контравариантного аргумента:

interface Concatable {
   function concat(Iterator $input);
}
class Collection implements Concatable {
   function concat(iterable $input) {/* . . . */}
}

Это были наиболее крупные изменения в языке. Так же произошли несколько более мелких изменений в следующих местах:

  • Пользовательская сериализация объектов
  • Приоритет операций при конкатенации
  • Поддержка исключений в __toString
  • Рефлексия для ссылок
  • Добавлен метод mb_str_split
  • Всегда доступное расширение ext-hash
  • PEAR не включен по умолчанию
  • Реестр алгоритмов хэширования паролей
  • Слабые ссылки
  • Разделитель числовых литералов
  • Короткие открывающие теги объявлены устаревшими
  • Левоассоциативный тернарный оператор объявлен устаревшим
  • Обратно несовместимые изменения

Подробнее об этих изменениях вы можете почитать в документации.