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 не включен по умолчанию
- Реестр алгоритмов хэширования паролей
- Слабые ссылки
- Разделитель числовых литералов
- Короткие открывающие теги объявлены устаревшими
- Левоассоциативный тернарный оператор объявлен устаревшим
- Обратно несовместимые изменения
Подробнее об этих изменениях вы можете почитать в документации.