Что нового в PHPStan 1.0? — CloudSavvy ИТ

Логотип PHPStan

В начале ноября 2021 года PHPStan получил знаковый выпуск с новыми функциями, дополнительными правилами и множеством оптимизаций производительности. Это означает, что ведущий статический анализатор PHP теперь считается стабильным и поставляется с обещание обратной совместимости для будущих обновлений.

Поскольку PHPStan 1.0 представляет собой серьезную проблему для семвера, она также содержит некоторые критические изменения, которые могут повлиять на ваши существующие сканирования. К ним относятся дополнительные правила и некоторые замененные или удаленные параметры конфигурации.

Новый уровень 9

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

Уровни PHPStan используются для настройки строгости анализатора. Серия релизов v0.x предлагала восемь уровней, из которых 0 — самый расслабленный, а 8 — самый строгий. Хотя для наилучшего покрытия предпочтительно использовать максимально возможный уровень, менее строгие уровни могут помочь вам познакомить PHPStan с несовершенной кодовой базой.

PHPStan 1.0 добавляет уровень 9 в качестве новой опции. Он включает в себя все правила уровня 8 и ниже, а также одну дополнительную проверку: строгие сравнения смешанных типов.

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

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

Чтобы выбрать новое поведение, вам нужно изменить уровень: 8 на уровень: 9 в конфигурационном файле phpstan.neon. PHPStan также поддерживает level: max в качестве псевдонима для самого высокого уровня. Если вы уже используете max, вы автоматически получите уровень 9 при обновлении до PHPStan 1.0.

Лучшая осведомленность в блоках «Попробуй-наконец-то»

PHPStan теперь имеет лучший вывод типов и осведомленность о переменных для блоков try-catch-finally. Он будет использовать тег @throws docblock для проверки типов исключений, создаваемых каждой функцией в вашей кодовой базе. Это понимание используется для информирования о проверках доступности переменных в блоках try-catch.

Вот пример, демонстрирующий, почему это важно:

/ ** * @throws DemoException * / function first () {throw DemoException (); } / ** * @throws OtherException * / function second () {throw OtherException (); } попробуйте {$ first = first (); $ второй = второй (); } catch (DemoException $ ex) {error_log ($ секунда); } catch ( Exception $ ex) {error_log («Общее исключение»); }

Первый блог перехвата обращается к $ second, но этого не будет при перехвате DemoException. PHPStan v1.0 использует оператор @throws для реализации этого, поэтому вы будете проинформированы, когда ваши блоки catch ссылаются на возможно неопределенные переменные. Функции без аннотаций @throws обычно ведут себя так же, как и раньше.

В результате этого изменения необязательный параметр PolluteCatchScopeWithTryAssignments был удален. Это использовалось, чтобы позволить вам получить доступ к переменным, установленным в блоке try в следующем улове; он больше не нужен, так как PHPStan теперь может определять, какие переменные доступны.

Обнаружение неиспользуемого кода

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

Их присутствие почти всегда непреднамеренно. Если вы хотите, чтобы мертвый код оставался дольше, вы можете попробовать его закомментировать или добавить комментарий @ phpstan-ignore-next-line, чтобы обойти проверку.

Улучшение запомненных ценностей

v1.0 улучшает согласованность памяти PHPStan для значений, возвращаемых функцией. Он лучше понимает, когда функция вызывается второй раз, что позволяет лучше предвидеть идентичные возвращаемые значения.

Это приводит к улучшенному обнаружению мертвого кода, когда условие повторяется несколько раз. PHPStan предупредит, когда блок станет избыточным, потому что выполнение прерывается более ранней ветвью с тем же условием:

если ($ демо -> isActive ()) {возврат; } если ($ demo -> isActive ()) {recordDemoActivity (); }

Второй блок никогда не запустится, так как первый всегда завершается. Однако есть предположение: isActive () всегда должен возвращать тем же значение в течение всего времени существования $ demo. Говоря более конкретно, isActive () должна быть чистой функцией, в которой повторяющиеся вводы всегда производят идентичный вывод.

PHPStan предполагает, что функции по умолчанию чистые. В тех случаях, когда это не так, вы можете добавить аннотацию @ phpstan-impure в блок документации над определением функции. Это отключит память возвращаемых значений для этой функции. Вам нужно будет использовать это в приведенном выше примере, если isActive () может возвращать разные значения для каждого вызова, что означает, что первая проверка может приравниваться к false и позволять запускать вторую ветвь.

/ ** @ phpstan-impure * / public function isActive (): bool {return (date («Y») === «2021»); }

Другие улучшения правил

К существующим уровням с 1 по 6 было добавлено несколько новых правил. В их число входят проверки на переопределение. константы а также характеристики, пытаясь продлевать последний класс и обнаружение условий цикла while «всегда истинно» и «всегда ложно».

Типы теперь рекурсивно проверяются на отсутствие подсказок. Это означает, что определения PHPDoc, такие как array , не будут приняты, поскольку в них отсутствует определение внутреннего типа. Вам также нужно будет ввести ожидаемые значения элементов массива второго уровня, например array >.

Помимо проверки исходного содержимого, PHPStan 1.0 также проверяет общую достоверность файлов .php. Уровень 0 получает проверку на наличие начальных и конечных пробелов файла и спецификации, поскольку неуместные символы до или после пары тегов Могут вызвать неожиданный результат во время выполнения.

Производительность и стабильность

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

Поскольку v1.0 считается формальным стабильным выпуском, он поставляется с уверенность что будущие второстепенные выпуски (1.1, 1.2, 1.3 и т. д.) будут обратно совместимы. Хотя для перехода с v0.x на v1.0 могут потребоваться некоторые настройки конфигурации, в будущем у вас будет более простой способ миграции.

Разработчики расширений PHPStan и настраиваемых наборов правил также выигрывают от наличия более стабильной кодовой базы, которая с меньшей вероятностью изменится. Документация для разработчиков также была расширена, включая более доступный охват создание настраиваемого правила. При внедрении собственных правил вашей команды в анализ PHPStan должно быть проще приступить к работе.

Хотя это является хорошим предзнаменованием для будущей поддержки, как пользователи, так и разработчики расширений сталкиваются с серьезными изменениями при переходе на версию 1.0. Некоторые параметры конфигурации сканирования были переименованы или изменены, при этом bootstrap стал bootstrapFiles, а excludes_analyse был заменен на excludePaths.

Внутренне API расширений был тщательно переработан, поэтому многие классы и методы были изменены или удалены. Полный список обратно несовместимых изменений доступен в журнал изменений v1.0.

Резюме

PHPStan v1.0 совершенствует проект за счет оптимизации производительности, добавления новых правил и устранения некоторых нарушений в обнаружении. Развитие PHPStan за последние несколько лет способствовало более широкому переходу сообщества PHP к использованию концепций типизированного языка. Добавление таких функций, как типизированные свойства и типы объединения, позволило создать язык, способный поддерживать расширенную внешнюю проверку, а также подробный внутренний самоанализ через отражение.

Продвижение к стабильной версии semver должно способствовать дальнейшему внедрению PHPStan в сообществе. Переход на новую версию должен быть довольно простым для современных проектов, которые уже используют строгий уровень правил PHPStan.

Вы можете перейти на PHPStan v1.0 сегодня, запустив composer require phpstan / phpstan в своих проектах. Желательно прочитать примечания к выпуску в первую очередь, чтобы определить критические изменения, которые необходимо устранить. Наличие дополнительных правил на каждом существующем уровне может привести к тому, что ваша кодовая база начнет неудачные тесты, даже если она прошла с PHPStan v0.x. Вы можете временно отключить новые правила, добавив их в ваш исходный уровень поэтому они исключены из результатов сканирования.

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *