11---
22layout : post
33title : " Mypy vs Phpstan: битва стат анализаторов"
4- date : 2026-02-05
4+ date : 2026-02-18
55categories : ru
66tags : " python php mypy phpstan"
77---
88
99## Дисклеймер
10- Все сказанное ниже валидно для mypy 1.19.1 и phpstan 2.1.37.
10+ Все сказанное ниже валидно для mypy 1.19.1 (дефолтный конфиг) и phpstan 2.1.37 (level: 10) .
1111
1212## Что происходит?
1313Я собираюсь сравнить два статических анализатора, mypy и phpstan, с точки зрения качества выполнения
@@ -18,7 +18,7 @@ tags: "python php mypy phpstan"
1818Однако беда этого сравнения в том, что оно
1919априори некорректно, потому что эти два инструмента используются в двух разных языках
2020программирования: mypy в python, а phpstan в php. И, получается, они даже не конкуренты.
21- Но давайте я все же попробую оправдаться, и пояснить за эту дерзость .
21+ Но давайте я все же попробую оправдаться, и пояснить за этот наброс .
2222
2323Во-первых, это оба си-подобные языки, у которых схожая система примитивных типов. И они даже оба
2424null-safety.
3434a = 5
3535pow (a, 4 )
3636```
37- валидный, хоть тип переменной и меняется в рантайме.
37+ валидный. Хотя тип переменной меняется в рантайме.
3838
3939В-третьих, оба языка используют специальные синтаксические конструкции для уточнения типов переменных,
4040которые исчезают в рантайме. Они позволяют статическому анализатору и IDE разобраться, в чем
@@ -61,8 +61,7 @@ php и python. И я бы даже не взялся писать подобно
6161или еще где-то.
6262Здесь же у меня опыт использования двух самых популярных стат анализаторов (по звездочкам на гитхабе) для каждого из языков.
6363
64- Теперь, когда сова полностью на глобусе, можно переходить к сути. И я буду двигаться от менее
65- важных, на мой взгляд, кейсов к более фундаментальным.
64+ Теперь, когда сова полностью на глобусе, можно переходить к сути.
6665
6766## Енумы и литералы
6867
@@ -137,7 +136,7 @@ def accept_enum_return_foo_bar(enum: FooBarBaz) -> FooBarValue:
137136
138137Таким образом, для каждого подмножества значений енумов нам придется отдельно прописывать новый
139138тип с литералами, что не улучшает настроение. Конечно я не один такой страдающий тут.
140- Фича [ реквест] ( https://github.com/python/typing/issues/781 ) висит уже 5 лет. Но увы.
139+ [ Фича- реквест] ( https://github.com/python/typing/issues/781 ) висит уже 5 лет. Но увы.
141140
142141## Literal Widening
143142
@@ -423,10 +422,10 @@ function returnOptInt(): ?int
423422поведение аналогичное mypy.
424423
425424В отличие от phpstan разработчики mypy на просьбу добавить возможность маркировать функции чистыми ответили, что
426- это [ сложно] ( https://github.com/python/mypy/issues/4468 ) . Может и так. Но разработчикам от этого не легче.
425+ это [ сложно] ( https://github.com/python/mypy/issues/4468 ) . Может и так. Но от этого не легче.
427426
428427## Вывод
429- Невозможно переоценить значимость статического анализатора для языков вроде php и python. В наши написать
428+ Невозможно переоценить значимость статического анализатора для языков вроде php и python. В наши дни написать
430429код, лишенный ошибок, без строгой типизации --- что-то из разряда чудес. По крайней мере, в относительно крупных
431430проектах. Поэтому за последние
43243110 лет статические анализаторы так прочно вошли в тулсет всех разработчиков.
0 commit comments