PHP в 2020 году

Standard

Это не секрет среди web-разработчиков и программистов в целом: PHP имеет не самую лучшую репутацию. Несмотря на то, что он по-прежнему является одним из наиболее популярных языков для создания web-приложений; За эти годы PHP сумел зарекомендовать себя как не очень чистый и понятный код, большое количество молодых и слабых разработчиков, небезопасный код, не консистентная core library, и прочее.

Хотя многие аргументы против PHP остаются в силе и сегодня, есть и хорошая сторона: вы можете писать чистые и поддерживаемые, быстрые и надежные приложения на PHP.

В этом посте я хочу взглянуть на эту светлую сторону разработки PHP. Я хочу показать вам, что, несмотря на многие недостатки, PHP является полезным языком для изучения. Я хочу, чтобы вы знали, что эра PHP 5 подходит к концу. Это, если вы хотите, вы можете написать современный и чистый код PHP, и оставить позади все недостатки и недочеты, которые были 10 лет назад.

Итак, давайте посмотрим, как язык изменился, даже повзрослел за последние несколько лет.

Давайте начнем!

Прежде чем углубляться в детали, давайте рассмотрим, как в наши дни разрабатывается язык PHP. Сейчас мы находимся на версии 7.4, а следующей версией станет PHP 8.0 в конце 2020 года.

Начиная с поздней эры 5.х, основная команда старается поддерживать постоянный годовой цикл релизов и преуспела в этом в течение последних четырех лет!

В целом, каждый новый релиз активно поддерживается в течение двух лет и получает еще один год «только исправлений безопасности». Цель состоит в том, чтобы побудить разработчиков оставаться в курсе как можно больше: небольшие обновления каждый год легче, чем, например, переход от 5,4 до 7,0.

Разработка PHP в настоящее время осуществляется группой добровольцев, некоторые из которых получают заработную плату от своих работодателей, чтобы они работали над “ядром” все время (full time). Большая часть обсуждения того, как развивается язык, происходит в mailing list.

После всего этого давайте опровергнем некоторые распространенные заблуждения о современном PHP.

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

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

Сегодня PHP является довольно уникальным языком: он по-прежнему позволяет вам писать полностью динамически типизированный код, но также имеет гораздо более сильную систему опциональных типов. В сочетании со статическим анализом и такими инструментами, как Psalm, Phan и PHPStan, вы можете написать безопасный, строго типизированный и статически проанализированный код.

Взгляните, например, на этот фрагмент кода PHP, полностью используя его современную систему типов:

<?php

declare(strict_types=1);

final class Foo
{
    public int $intProperty = 2;

    public ?string $nullableString = null;

    private Bar $bar;

    public function __construct(Bar $bar) {
        $this->bar = $bar;
    }
    
    public function withInt(int $value): self
    {
        $clone = clone $this;
    
        $clone->intProperty = $value;

        return $clone;
    }
    
    public function unionTypes(int|float $input): void
    {
        // Union types will be added in PHP 8
    }
}

По правде говоря, в системе типов PHP по-прежнему отсутствует одна важная особенность: generics. Есть надежда, что они будут добавлены, но пока нет ничего конкретного. В случае типизированных массивов вам нужно полагаться на PHPDoc, чтобы получить надлежащую поддержку IDE:

/** @var int[] */
public array $arrayOfInts = [];

И хотя типизированные массивы являются распространенным вариантом использования дженериков (generics), которые можно решить с помощью docblocks (PHPDoc), мы упускаем гораздо больше функциональности, потому что их нет в языке… пока.

PHP’s синтаксис

Эра 7.х сделала много хорошего, сделав PHP более зрелым языком, когда дело доходит до синтаксиса. Чтобы проиллюстрировать это, я сделал не полный список новых вещей в PHP.

Деструктуризация массива:

[$a, $b] = $array;

Нулевой оператор объединения:

$value = $object->property ?? 'fallback if null';

$value = $array['foo'] ?? "fallback if key doesn't exists"; 

The null coalescing assignment оператор:

public function get(string $input): string 
{
    return $this->cache[$input] ??= $this->sanitize($input);
}

Распределение массива:

$a = [/* … */];
$b = [/* … */];

$mergedArray = [...$a, ...$b];

Вариадические функции:

public function get(Foo ...$foos): void
{
    foreach($foos as $foo) {
        // …
    }
}

распаковку Аргументов:

$this->get(...$arrayOfFoo);

Typed properties:

public int $intProperty;

Arrow functions, так же называемые “короткими замыканиями”:

$ids = array_map(fn(Post $post): int => $post->id, $posts);

Генераторы:

function make(array $input): Generator
{
    foreach ($input as $item) {
        yield $this->doSomethingWith($item);
    }
}

И многое другое. Я надеюсь, что из этого списка ясно, что PHP все еще развивается сегодня, и вы можете быть уверены, что есть еще что-то хорошее.

PHP’s performance

В 5.x производительность PHP была… в лучшем случае средней. Однако в версии 7.0 большие части “ядра” PHP были переписаны с нуля, что привело к увеличению производительности в два-три раза. Кроме того, каждая версия 7.x оказала положительное влияние на производительность.

Слов не хватает, хотя. Давайте посмотрим на “бенчмарки”. К счастью, другие люди потратили много времени на тестирование производительности PHP. Я считаю, что у Kinsta хороший обновленный список.

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

Когда выйдет PHP 8, в нашем распоряжении также будет JIT-компилятор, обещающий интересные улучшения производительности и позволяющий PHP входить в новые области помимо веб-разработки.

Фреймворки и экосистема

Переходя к тому, что сделано сообществом с помощью PHP. Давайте будем чисты: PHP больше не просто WordPress, а напротив.

В общем, есть два основных фреймворка веб-приложений и несколько более мелких: Symfony и Laravel. Конечно, есть также Laminas, Yii, Cake, Code Igniter и т. д. – но если вы хотите знать, как выглядит современная PHP-разработка, вам достаточно знать однин из первых двух.

Оба фреймворка имеют большую экосистему пакетов и продуктов. Начиная от административных панелей и CRM до автономных пакетов, CI для профилировщиков, многочисленных сервисов, таких как серверы веб-сокетов, менеджеры очередей, интеграции платежей; честно говоря, слишком много, чтобы перечислить.

Эти фреймворки предназначены для настоящей разработки; если вам нужно чистое “управление контентом”, такие платформы, как WordPress, Drupal и прочие, улучшаются все лучше и лучше.

Один из способов измерить текущее состояние экосистемы PHP – взглянуть на Packagist, основной репозиторий пакетов для PHP. Там можно увидеть экспоненциальный рост, с +25 миллионами загрузок в день, можно сказать, что экосистема PHP – не та слабая сторона, которой она была.

Посмотрите на этот график, в котором указано количество пакетов и версий с течением времени. Его также можно найти на веб-сайте Packagist.

Помимо фреймворков и CMS, мы также наблюдаем рост асинхронных фреймворков в последние годы. Это фреймворки и серверы, написанные на PHP или других языках, которые позволяют пользователям запускать действительно асинхронный код PHP. Некоторые крупные игроки – это Swoole, Amp и ReactPHP.

С тех пор как мы углубились в асинхронный мир, такие вещи, как web-сокеты и приложения с большим количеством операций ввода-вывода, стали действительно актуальными в мире PHP.

В списке рассылки о внутренностях также говорилось о том, чтобы добавить libuv в ядро. Для тех, кто не знает libuv: это та же библиотека, которую Node.js использует для обеспечения всей ее асинхронности. Кто знает, PHP 8 может быть версией, где ее добавят его в ядро!

В заключении

Надеюсь, я смог показать вам, что PHP значительно эволюционировал за последние годы, и вы прекрасно умеете писать чистый и поддерживаемый код с его помощью.

Таким образом, в то время как у языка определенно есть свои недостатки и 20-летнее наследие; Я могу с уверенностью сказать, что мне нравится работать с ним.

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

перевод – оригинал

2 thoughts on “PHP в 2020 году

  1. J

    Деструкторы массивов не имеют путей поведения для неподходящих данных,
    Массивы ни в какую сторону не совместимы с итераторами, iterable только ухудшает всё
    Тайпкастинга классов нет ни в каком виде

    60% новых фич не нужны если ты делаешь сайт, 90% – если при этом используешь фреймворк.

Leave a Reply

Your email address will not be published. Required fields are marked *