- PVSM.RU - https://www.pvsm.ru -

От версии 8 к 8.1: новый виток развития PHP

От версии 8 к 8.1: новый виток развития PHP - 1

Я уже несколько раз писал о том, что происходило с PHP за год и всегда с нетерпением ждал следующего года. Я делал это в 2020-м [1] и 2019-м [2]. И продолжаю делать в 2021-м. 

Я всегда повторяю: PHP это уже не тот язык, которым он был десять лет назад, и мы очень этому рады. Сегодня это быстрый и надёжный язык, позволяющий разрабатывать сложные и масштабируемые приложения. Давайте обсудим некоторые из наиболее заметных изменений, которые появились за год — как в самом языке, так и в экосистеме.

От версии 8 к 8.1

Новая мажорная версия PHP 8 [3] появилась в конце прошлого года. Я уже много об этом писал, так что не буду здесь повторяться. Как всегда, его производительность становится всё лучше и лучше. Этот факт подтверждают тесты [4] от Kinsta.

Во многом, это заслуга компилятора JIT [5] (Just in time, «на лету»). Он действительно улучшает производительность (что особенно справедливо для математических операций). Но счастье было бы не полным, если бы ранее в PHP 7.4 не появилась предзагрузка [6]. Она компилирует исходные файлы в опкоды и связывает зависимые классы, трейты и интерфейсы. Такой «скомпилированный» фрагмент исполняемого кода (то есть кода, который может использовать PHP-интерпретатор) сохраняется в памяти и становится доступен для всех запросов. Это положительно влияет на производительность, если вы, конечно, не используете виртуальный хостинг [7].

От версии 8 к 8.1: новый виток развития PHP - 2

Стоит также упомянуть атрибуты [8] (они же «аннотации»), именованные параметры [9] (Named Arguments) и объявление свойств в конструкторе [10] (Constructor Property Promotion), поскольку они определённо способствовали тому, что 8-я версия PHP получилась настолько удачной.

Не останавливаясь на достигнутом, PHP Core Team уже работает над следующей версией, PHP 8.1 [11], которая должна выйти к концу 2021 года. На данный момент больше всего заслуживают внимания перечисления (enums [12]) и файберы (fibers [13], зелёные потоки). Я ещё буду говорить о них позже в этой статье.

Год за годом команда выдаёт стабильные версии с множеством фич и других нововведений, улучшающих жизнь PHP-разработчикам. Среди прочего, в этот раз был усовершенствован процесс миграции. Я достаточно быстро перетащил некоторые из моих собственных проектов с PHP 7.4 на PHP 8: мне потребовалось около часа на каждый проект. Так что, у нас осталось ещё меньше поводов откладывать миграцию.

Система типов

Наконец-то в PHP добавят перечисления.

enum Status {

  case Pending;

  case Active;

  case Archived;

}

Ниже — пример их использования:

class Order

{

	public function __construct(

    	private Status $status = Status::Pending;

	) {}

	public function setStatus(Status $status): void

	{

    	// …

	}

}

$order->setStatus(Status::Active);

Кроме того, появился RFC-запрос на добавление в язык нового типа never [14].

Использование never будет означать, что функция с таким типом возвращаемого значения не сможет вернуть результат и должна прервать выполнение программы — выбросить исключение, вызвать exit или сделать это каким-то другим способом.

function dd(mixed $input): never

{

    // dump

    

    exit;

}

Отмечу, что never принципиально отличается от void: функция с возвращаемым значением типа void способна вернуть результат, а значит, прерывать работу программы нет необходимости. Такое нововведение может показаться слегка необычным, но оно обязательно найдёт применение в статическом анализе кода.

И ещё пару слов о статическом анализе: PhpStorm добавил [15] встроенную поддержку анализаторов Psalm [16] и PhpStan [17]. После этого количество пользователей этих двух продуктов должно увеличиться.

К сожалению, дженерики (generics) по-прежнему нативно не поддерживаются. Есть несколько серьёзных проблем. В первую очередь, не забывайте, что PHP — это всё ещё язык с динамической типизацией. Здесь [18] Nikita уже писал о связанных с этим проблемах. На мой взгляд, самый простой выход — нативно реализовать поддержку лишь так называемых runtime-erased generics [19], добавив в язык новый синтаксис без применения каких-либо дополнительных проверок типа во время выполнения и полагаясь на статический анализ. Однако, для этого требуется больше, чем просто техническое решение: нужно изменить мышление [20] участников PHP-сообщества в целом. Может быть, когда-нибудь это станет возможным. Когда-нибудь.

Асинхронный PHP

Буквально недавно мы узнали, что в PHP 8.1 появятся корутины, также известные как файберы. 

Простой пример использования файберов:

$fiber = new Fiber(function (): void {

	$valueAfterResuming = Fiber::suspend('after suspending');

    

	// …

});

$valueAfterSuspending = $fiber->start();

$fiber->resume('after resuming');

Хотя одних только файберов недостаточно для того, чтобы язык стал по-настоящему асинхронным. Они могут лишь стать маленькой шестерёнкой в «большой асинхронной машине». 

Однако, соответствующий RFC снова вызвал интерес у «автолюбителей асинхронности», чему мы можем только радоваться. Популярность асинхронных фреймворков, таких как Amphp [21] и ReactPHP [22], растёт: недавно Laravel объявил [23] о встроенной поддержке Swoole [24] и RoadRunner [25].

Экосистема PHP

Я не могу не вспомнить о новом релизе Composer 2.0 [26], который вышел в октябре 2020 года. В этой версии есть несколько улучшений UX, но, что важнее всего, она демонстрирует большой прирост производительности. В условиях чистой установки прирост достигает 300%. Разница очень заметна на боевых проектах. Не зря пакетный менеджер Composer де-факто стал стандартом для PHP-разработчиков.

Мне нравится время от времени оценивать состояние экосистемы PHP, просматривая количество пакетов, доступных для скачивания. В прошлом году я говорил о ±25 миллионах загрузок в день. Сегодня это число увеличилось более чем вдвое, и мы уже видим ±60 миллионов загрузок в день.

Наконец, взгляните на этот график, в котором показано, как менялось количество доступных пакетов / версий с течением времени. Его можно найти на сайте Packagist.com [27]. Вы можете сами оценить, как растёт экосистема. И конца этому не видно.

От версии 8 к 8.1: новый виток развития PHP - 3

Дальше — больше

Давайте подытожим, пройдясь по всему, что было добавлено в PHP за последние годы. Если вы не следите за его развитием, матрериалы из списка помогут восполнить этот пробел. Я думаю, он наглядно показывает рост сообщества и команды разработчиков за последние годы. Уверен, что дальше будет ещё лучше.

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


Наши серверы [38] можно использовать для разработки на PHP.

Зарегистрируйтесь по ссылке выше или кликнув на баннер и получите 10% скидку на первый месяц аренды сервера любой конфигурации!

Автор: owlofmacloud

Источник [39]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/blog-kompanii-maklaud/363604

Ссылки в тексте:

[1] 2020-м: https://stitcher.io/blog/php-in-2020

[2] 2019-м: https://stitcher.io/blog/php-in-2019

[3] PHP 8: https://stitcher.io/blog/new-in-php-8

[4] тесты: https://kinsta.com/blog/php-benchmarks/

[5] JIT: https://stitcher.io/blog/jit-in-real-life-web-applications

[6] предзагрузка: https://stitcher.io/blog/php-preload-benchmarks

[7] виртуальный хостинг: https://www.reg.ru/?rlink=reflink-717

[8] атрибуты: https://stitcher.io/blog/attributes-in-php-8

[9] именованные параметры: https://stitcher.io/blog/php-8-named-arguments

[10] объявление свойств в конструкторе: https://stitcher.io/blog/constructor-promotion-in-php-8

[11] PHP 8.1: https://stitcher.io/blog/new-in-php-81

[12] enums: https://stitcher.io/blog/php-enums

[13] fibers: https://stitcher.io/blog/fibers-with-a-grain-of-salt

[14] never: https://stitcher.io/blog/new-in-php-81#new-never-type-rfc

[15] добавил: https://blog.jetbrains.com/phpstorm/2020/07/phpstan-and-psalm-support-coming-to-phpstorm/

[16] Psalm: https://psalm.dev/

[17] PhpStan: https://github.com/phpstan/phpstan

[18] десь: https://github.com/PHPGenerics/php-generics-rfc/issues/45

[19] runtime-erased generics: https://www.reddit.com/r/PHP/comments/iuhtgd/ive_proposed_an_approach_to_generics_on_internals/

[20] мышление: http://www.braintools.ru

[21] Amphp: https://amphp.org/

[22] ReactPHP: https://reactphp.org/

[23] объявил: https://laravel-news.com/laravel-octane

[24] Swoole: https://www.swoole.co.uk/

[25] RoadRunner: https://roadrunner.dev/

[26] Composer 2.0: https://blog.packagist.com/composer-2-0-is-now-available/

[27] Packagist.com: https://packagist.org/statistics

[28] Match: https://stitcher.io/blog/php-8-match-or-switch

[29] Short closures: https://stitcher.io/blog/short-closures-in-php

[30] Null coalescing operator: https://stitcher.io/blog/shorthand-comparisons-in-php#null-coalescing-operator

[31] Traits: https://www.php.net/manual/en/language.oop5.traits.php

[32] Typed properties: https://stitcher.io/blog/typed-properties-in-php-74

[33] Spread operator: https://wiki.php.net/rfc/argument_unpacking

[34] JIT: https://stitcher.io/blog/php-jit

[35] Return type declarations: https://www.php.net/manual/en/functions.returning-values.php#functions.returning-values.type-declaration

[36] Generators: https://wiki.php.net/rfc/generators

[37] FFI: https://wiki.php.net/rfc/ffi

[38] серверы: https://macloud.ru/?partner=4189mjxpzx

[39] Источник: https://habr.com/ru/post/554008/?utm_source=habrahabr&utm_medium=rss&utm_campaign=554008