The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Выпуск PHPStan 1.0, статического анализатора для кода на языке PHP

02.11.2021 11:47

После шести лет разработки состоялся первый стабильный релиз статического анализатора PHPStan 1.0, позволяющего находить ошибки в коде на языке PHP без его выполнения и использования unit-тестов. Код проекта написан на языке PHP и распространяется под лицензией MIT.

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

  1. Базовые проверки, определение неизвестных классов, функций и методов ($this), неопределённых переменных, а также передачи неверного числа аргументов.
  2. Выявление вероятно неопределённых переменных, неизвестных magic-методов и свойств классов с __call и __get.
  3. Выявление неизвестных методов во всех выражениях, не ограничиваясь вызовом через $this. Проверка PHPDocs.
  4. Проверка возвращаемых типов и назначения типов свойствам.
  5. Базовое выявление "мёртвого" (никогда не вызываемого) кода. Выявление вызовов instanceof всегда возвращающих значение false, никогда не срабатывающих блоков "else" и кода, находящегося после return.
  6. Проверка типов аргументов, передаваемых в методы и функции.
  7. Предупреждение об отсутствии аннотаций с информацией о типах.
  8. Предупреждение о некорректных union-типах, определяющих коллекции из двух и более типов.
  9. Предупреждение о вызове методов и доступе к свойствам с типами "nullable".
  10. Проверка использования типа "mixed".

Примеры выявляемых базовых проблем:

  • Существование классов, используемых в instanceof, catch, typehints и других языковых конструкциях.
  • Существование и доступность вызываемых методов и функций, а также числа передаваемых аргументов.
  • Проверка возвращения методом данных с тем же типом, что определён в выражении return.
  • Существование и видимость свойств, к которым выполняется обращение, а также проверка объявленных и фактических типов данных, используемых в свойствах.
  • Корректность числа параметров, переданных в вызовы sprintf/printf в блоке форматирования строк.
  • Существование переменных с учётом блоков, формируемых операторами ветвления и циклами.
  • Бесполезные приведения типов (например, "(string) ‘foo’") и строгие проверки ("===" и "!==") данных с разными типами и операндами, всегда возвращающими значение false.

Ключевые новшества PHPStan 1.0:

  • Реализован уровень проверки "9", осуществляющий проверки использования типа "mixed", предназначенного для организации приёма функцией параметров с разными типами. Девятый уровень выявляет небезопасные приёмы использования "mixed", такие как передача значений с типом "mixed" другому типу, вызов методов с типом "mixed" и обращение к его свойствам, так как они могут не существовать.
  • Управление проверкой идентичности возвращаемых значений для одинаковых вызовов функций с использованием аннотаций @phpstan-pure и @phpstan-impure.
  • Анализ типов в конструкциях try-catch-finally с использованием аннотаций @throws.
  • Выявление определённых, но неиспользуемых внутренних (private) свойств, методов и констант.
  • Передача несовместимых callback-вызовов в функции работы с массивами, такие как array_map и usort.
  • Инспектирование типов для отсутствующих typehint-аннотаций.
  • Обеспечена совместимость описаний типов с PHPDocs, что позволяет использовать в PHPDocs типы из сообщений об ошибках.


  1. Главная ссылка к новости (https://phpstan.org/blog/phpst...)
  2. OpenNews: Выпуск Psalm 3.12, статического анализатора для языка PHP
  3. OpenNews: Выпуск Snuffleupagus 0.5.1, модуля для блокирования уязвимостей в PHP-приложениях
  4. OpenNews: Разработчики PHP предложили P++, диалект со строгой типизацией
  5. OpenNews: Выпуск виртуальной машины HHVM 4.0 с прекращением поддержки PHP
  6. OpenNews: Отчёт о компрометации git-репозитория и базы пользователей проекта PHP
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/56087-phpstan
Ключевые слова: phpstan, static, php
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (37) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Aleksandr Zhuravlev (?), 12:22, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Psalm лучше :)
     
     
  • 2.7, Растоманя (ok), 12:47, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Лудше борров чекера ничего нет, коллега.
     
     
  • 3.21, Аноним (21), 13:31, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ты сын таньки и серёжки?
     
  • 3.26, Аноним (-), 14:56, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Что это, Растoманя?
     
  • 3.31, Аноним (31), 15:34, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Многих боровов надо проверять перед тем как употреблять в пищу, но причем тут язык программирования?
     
     
  • 4.39, QwertyReg (ok), 17:45, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • –5 +/
    Юмор уровня "opennet".
     

  • 1.2, Урри (ok), 12:32, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Ну что за ретрограды и эти, как их там, луддиты!

    Нет, чтобы прибить звоздями прямо в язык, как в одном все вы знаете каком решении.

    --
    Ну а если без шуток - молодцы! Больше правильных инструментов, всяческих и разных.

     
  • 1.3, freecoder (ok), 12:37, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Что только люди не придумывают, лишь бы не писать сами знаете на чем )
     
     
  • 2.10, Anonymous XE (?), 12:53, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    На Electron
     
  • 2.11, QwertyReg (ok), 12:56, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • –9 +/
    Да, какие только обмазки для мёртвых языков не напишут.
     
  • 2.24, Аноним (24), 13:53, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    На серверном жс что ли?
     

  • 1.15, fernandos (ok), 13:02, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Прекрасно! Отличный статический анализатор.
     
  • 1.23, Аноним (23), 13:41, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Хороший проект, но пользоваться им я конечно не буду, как впрочем и самим языком.
     
  • 1.25, Аноним (25), 14:40, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Даже стало интересно что будет если его запустить на ядре битрикса)
     
     
  • 2.27, Аноним (27), 14:59, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Думаю случится сегфолт.
     

  • 1.38, Аноним (38), 17:21, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    My tea's gone cold, I'm wondering why I
    Got out of bed at all
    The morning rain clouds up my window
    And I can't see at all

    (Eminem ft. Dido - PHPStan)

     
  • 1.40, th3m3 (ok), 18:28, 02/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    А кому нужен сегодня php, кроме как для любителей клепать сайты за еду и кровавому интерпрайзу?
     
     
  • 2.41, Аноним (41), 18:37, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    PHP - нормальный серверный язык. А что есть лучше, Руби что-ли?
     
     
  • 3.42, th3m3 (ok), 19:35, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > PHP - нормальный серверный язык. А что есть лучше, Руби что-ли?

    Всё лучше php.

     
     
  • 4.51, john_erohin (?), 16:58, 03/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Всё лучше php.

    да ну ?
    например люди говорят, что python - самый медленный скриптовый язык из всех какие есть.
    и на  синтетических тестах, и на реальных задачах.

     
     
  • 5.52, th3m3 (ok), 18:19, 03/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    И? Python если надо, можно ускорить. Для своих задач он хорош. Занимает топовые места в рейтингах ЯП, в отличии от php.
     
     
  • 6.53, Аноним (53), 00:42, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Давай, ускорь. И потребление памяти уменьши, чтобы кэшмисы направо-налево не ловить.
    Топовые места вся эта помойка занимает, потому что в настоящее программирование не может молодежь, вот и нравится ей всякое г.
     
  • 6.54, Онаним (?), 01:02, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    80%+ вёба - это не топовое место, не.
     
     
  • 7.57, th3m3 (ok), 02:41, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > 80%+ вёба - это не топовое место, не.

    Любит наш народ, всякое Г.

     
     
  • 8.59, Онаним (?), 09:58, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Г - это Гвидобейсик ... текст свёрнут, показать
     
  • 5.58, Аноним (58), 09:18, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Мало ли что говорят, возьми_те и посмотри_те. PHP конечно быстрее Python/Ruby

    Но вам куда эта скорость в вебе?

     
     
  • 6.60, Онаним (?), 09:58, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    А кто сказал, что PHP только в вёбе.
    В вёбе его просто столько, что остальные (кроме жабки, наверное) банально теряются и не заметны.
    Но это не значит, что его нет за пределами вёба.
     
  • 6.61, Dnina (ok), 12:08, 05/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Можешь спросить об этом представителей любого крупного проекта, в котором миллисекунды экономят миллионы долларов.
    Люди даже всякие HHVM и KPHP делали.
     
  • 3.43, Смузи (?), 20:39, 02/11/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    ПХП как Президент.
     
  • 3.46, Аноним (58), 01:14, 03/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Конечно Ruby
     

  • 1.45, Аноним (58), 01:11, 03/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    PHP превратился во что-то Java подобное и стал более уродлив
    Насыпали кучу сахара
     
     
  • 2.48, onanim (?), 11:18, 03/11/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > PHP превратился во что-то Java подобное и стал наконец ынтырпрайзом

    fixed

     
  • 2.55, Онаним (?), 01:05, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Меня бесят только попытки угодить косолапым неумёхам через подобие статической типизации, которое вдобавок к ожирдяиванию записи ещё всерьёз тормозит вызовы даже с JIT (хотя должно было бы слегка наоборот быть, а по факту - проверка типов вся в рантайме и оверхед у неё офигенный).

    В остальном уже с 7.0 стало очень хорошо, 8.0 ещё лучше, 8.1 тоже обещает быть интересным, наконец-то будет можно писать полноценные coroutines с глубоким ветвлением (Fiber), хотя оверхед у переключения контекста там тоже недетский, судя по первым ощущениям, где-то тактов так 200-300 лишних на suspend/resume по сравнению с yield/next в генераторах.

     
     
  • 3.56, Онаним (?), 01:17, 04/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Я попробовал в свой coroutine stack добавить статические типы в шедулер, лучше бы я этого не делал, вместо 8M контекст-свитчей в секунду на генераторах (на файберах 4.5M) получил 5.8M. Плюнул, вернул всё взад.

    Средний контекст-свитч на генераторах вышел тактов в 350 (включая в усмерть запрофайленную обвязку выбора coroutine и планирования) примерно с JIT, на файберах примерно 600, то есть контекст самого файбера стоит +250 тактов в среднем. Без JIT всё счастье примерно в 1.8 раза больше. Статическая типизация по ключевым методам и пропертям вместо оптимизации внезапно жрёт +150 тактов хоть с JIT, хоть без JIT, такие дела.

     

  • 1.47, Аноним (47), 02:13, 03/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    самую важную проверку не сделали
     
  • 1.49, Аноним (53), 12:31, 03/11/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    И без анализатора можно сказать, что весь PHP код - мертвый.
     
     
  • 2.62, Dnina (ok), 12:11, 05/11/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Какую только чушь люди не пишут.
    Как там в отдельном мире живётся?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру