[Перевод] PHP в 2019: лучше, чем вы о нём думаете
Помните некогда популярную публикацию: «PHP: фрактал плохого дизайна»? Я, когда впервые её прочитал, работал в дурацком месте с большим количеством устаревших PHP-проектов. Она заставила меня задуматься: должен ли я уйти и заняться чем-то совершенно другим, нежели программирование.
К счастью для меня, вскоре я смог сменить место работы, и, что более важно, PHP сумел «немного» развиться со времён 5.* версий. А сегодня посредством этой статьи я хочу обратиться к людям, которые либо больше не программируют на PHP, либо застряли в устаревших проектах.
Спойлер: на сегодняшний день у PHP, как почти у каждого языка программирования, полно недостатков. Многие основные функции всё ещё имеют несогласованные сигнатуры, настройки конфигурации запутаны, всё ещё полно разработчиков, пишущих дерьмовый код, потому что в их текущем проекте по другому не получается или потому, что они не умеют иначе.
Сегодня же я хочу взглянуть на светлую сторону: давайте сосредоточимся на том, что изменилось, и на способах написания чистого и поддерживаемого PHP-кода. Я хочу попросить вас отбросить на несколько минут предрассудки.
После этого вы можете думать о PHP точно так же, как и раньше. Хотя, скорее всего, вы будете удивлены некоторым улучшениям, сделанным в PHP за последние несколько лет.
TL; DR
- PHP активно разрабатывается, каждый год выходит новый релиз
- Производительность с эры PHP 5 выросла вдвое, если не втрое
- Существует чрезвычайно активная экосистема фреймворков и библиотек
- За последние несколько лет в PHP было добавлено много новых функций, и язык продолжает развиваться
- Инструменты, подобные статическим анализаторам, за последние годы очень развились и продолжают развиваться дальше
Краткая история
Вкратце рассмотрим релизный цикл PHP. Сейчас текущая версия PHP 7.3, а версия 7.4 ожидается в конце 2019 года. PHP 8.0 будет следующей версией после 7.4. Начиная с поздней эры PHP 5.*, команда мейнтейнеров старается поддерживать ежегодный цикл релизов и в течение последних четырех лет у неё это хорошо получается.
В целом, каждый новый релиз активно поддерживается в течение двух лет и получает ещё один год «исправлений безопасности». Цель состоит в том, чтобы мотивировать разработчиков на PHP поддерживать актуальность версии: применить небольшие обновления каждый год намного проще, чем, например, перейти с 5.4 на 7.0.
Обновляемый календарь сроков поддержки разных версий PHP можно найти тут.
Наконец, PHP 5.6 был последним релизом ветки 5.*, а 7.0 являлся следующим. Если вы хотите узнать, что случилось с PHP 6, Вы можете прослушать подкаст PHP Roundtable.
Теперь давайте развенчаем некоторые распространённые заблуждения о современном PHP.
Производительность PHP
В дни версий 5.* производительность PHP была… средней, в лучшем случае. Однако в версии 7.0 значительные части ядра PHP были переписаны с нуля, что привело к увеличению производительности в два-три раза.
Но слов недостаточно. Давайте посмотрим на тесты. К счастью, другие люди потратили много времени на бенчмаркинг производительности PHP. Я считаю, что у Kinsta есть хороший обновлённый список.
Начиная с версии 7.0, производительность только увеличивается. Настолько, что веб-приложения PHP имеют сопоставимую, а в некоторых случаях лучшую производительность, чем веб-фреймворки на других языках. Взгляните на этот обширный набор тестов.
Конечно, PHP-фреймворки не будут превосходить C и Rust, но они намного лучше, чем Rails или Django, и сопоставимы с ExpressJS.
Фреймворки и экосистема
Говоря о фреймворках: PHP больше не ограничивается WordPress. Смею заявить вам как профессиональный PHP-разработчик: WordPress никоим образом не является представителем современной экосистемы.
В общем, есть два основных фреймворка веб-приложений: Symfony и Laravel. И несколько более мелких: Zend, Yii, Cake, CodeIgniter и т. д. Но если вы хотите знать, как выглядит современная PHP-разработка, хорошим выбором будет познакомиться с одним из двух крупнейших.
Оба фреймворка (Symfony и Laravel) имеют большую экосистему пакетов и продуктов. Начиная от административных панелей и CRM до автономных пакетов (в оригинале — «standalone packages»), от CI до профилировщиков, а также многочисленные сервисы, такие как серверы веб-сокетов, менеджеры очередей, интеграции платежей; честно говоря, слишком много, чтобы перечислить все.
Однако эти фреймворки предназначены для непосредственной разработки. Если вы нуждаетесь просто в управлении контентом, такие платформы, как WordPress и CraftCMS, только всё больше и больше улучшаются.
Один из способов измерить текущее состояние экосистемы PHP — посмотреть на packagist — основной репозиторий пакетов для PHP. Он экспоненциально растёт. При ~25 миллионах загрузок в день, можно справедливо сказать, что PHP-экосистема — уже не та слабая сторона, которой она являлась раньше.
Посмотрите на этот график, в котором указано количество пакетов и версий с течением времени. Его также можно найти на веб-сайте packagist.
Кроме фреймворков приложений и CMS, в последние годы мы также наблюдаем рост асинхронных фреймворков.
Это фреймворки и серверы, написанные на PHP или других языках, позволяют использовать поистине асинхронный PHP. Среди примеров: Swoole, Amp и ReactPHP.
С тех пор как мы вошли в асинхронный мир, такие вещи, как веб-сокеты и приложения с большим количеством операций ввода-вывода, стали действительно актуальными в мире PHP.
В списке рассылки internals — месте, где ведущие разработчики обсуждают развитие языка, — также говорилось о том, чтобы добавить libuv в ядро. Для тех, кто не знает libuv — это та же библиотека, которую Node.js использует для обеспечения всей её асинхронности.
Сам язык
Хотя async и await ещё не доступны, за последние годы было сделано много улучшений в самом языке. Вот далеко неполный список новых функций в PHP:
- Стрелочные функции
- Нулевой оператор объединения
- Трейты
- Типизированные свойства
- Оператор распаковки
- JIT компилятор
- Интерфейс внешних функций
- Анонимные классы
- Декларации возвращаемого типа
- Современная криптография
- Генераторы
- Многое другое
В то время как мы говорим о языковых особенностях, давайте также затронем тему того, как язык развивается сегодня. Существует команда мейнтейнеров-добровольцев, которые двигают язык вперёд, при этом сообщество также может предлагать RFC.
Затем эти RFC обсуждаются в списке рассылки «internals», который также можно прочитать в интернете. Прежде чем новая языковая функция будет добавлена, необходимо провести голосование. Только RFC с большинством голосов, не менее ⅔ от всех проголосовавших, допускаются к включению в ядро.
В голосовании принимают участие около 100 человек, при этом требования голосовать на каждом RFC — нет. В группу людей, имеющих возможность голосовать, конечно, входят мейнтейнеры, т. к. они должны поддерживать кодовую базу. Помимо них, есть группа, участники которой были выбраны в индивидуальном порядке из сообщества PHP. Эта группа состоит из мейнтейнеров PHP-документации, авторов крупных PHP-проектов и выдающихся разработчиков из PHP-сообщества.
Хотя большая часть разработки происходит на добровольной основе, один из разработчиков ядра PHP, Никита Попов, недавно был нанят JetBrains для работы над языком на полный рабочий день. Другим примером является фонд Linux, который недавно решил инвестировать в Zend Framework. Подобные работы и приобретения гарантируют стабильность для будущего PHP и его развития.
Инструментарий
Помимо самого ядра, последние несколько лет мы наблюдаем увеличение инструментов вокруг него. На ум приходят статические анализаторы типа Psalm, созданный Vimeo, Phan и PHPStan.
Эти инструменты статически анализируют ваш PHP-код и сообщают о любых типовых ошибках, возможных багах и т. д. В некотором смысле, предоставляемые ими функциональные возможности можно сравнить с TypeScript (примечание переводчика: статические анализаторы расширяют возможности языка по поиску ошибок\недоработок тем самым улучшая язык, TS условно делает то же самое поверх JS), хотя на данный момент язык PHP не транспилируемый, поэтому настраиваемый синтаксис не допускается.
Несмотря на то, что при этом нам нужно полагаться на докблоки и типизацию, Расмус Лердорф, создатель PHP, упомянул идею добавления механизма статического анализа к ядру. Эта задача содержит в себе много потенциала, но по трудозатратам она огромна.
Говоря о транспилировании, стоит отметить, что были попытки расширить синтаксис PHP не на уровне ядра, а на уровне пользовательских библиотек, как это реализовано в JavaScript. Проект с именем Pre делает именно это: позволяет использовать новый синтаксис PHP, который переносится в обычный PHP-код.
Хотя такой подход зарекомендовал себя в мире JavaScript, он сможет заработать в PHP только если будет обеспечена надлежащая поддержка IDE и статического анализа. Это очень интересная идея, но она должна пройти ещё долгий путь, прежде чем её можно будет назвать «мейнстримом».
В заключение
Несмотря на всё сказанное, не стесняйтесь думать о PHP как об ужасном языке. У него определённо есть свои недостатки и 20-летнее наследие, но я могу с уверенностью заявить, что работать с ним мне нравится.
С его помощью я могу создавать надёжное, хорошо обслуживаемое и качественное программное обеспечение. Клиенты, на которых я работаю, довольны конечным результатом, как и я.
Несмотря на то, что при работе с PHP всё ещё можно написать очень плохой код, я бы сказал, что это отличный выбор для веб-разработки, если его использовать правильно.
Вы не согласны? Напиши в комменты, почему!