Download Latest Version 2.2.14 source code.zip (12.1 MB)
Email in envelope

Get an email when there's a new version of PHPStan

Home / 2.2.14
Name Modified Size InfoDownloads / Week
Parent folder
phpstan.phar 2026-09-12 28.9 MB
phpstan.phar.asc 2026-09-12 833 Bytes
2.2.14 source code.tar.gz 2026-09-12 12.1 MB
2.2.14 source code.zip 2026-09-12 12.1 MB
README.md 2026-09-12 4.2 kB
Totals: 5 Items   53.1 MB 5

Improvements 🔧

  • Apply finally scope changes to try-catch exit points and check by-ref return types after finally (#6393), [#13338]
  • Fix PHP 8.6 deprecation in hoa/consistency (#6405), thanks @SanderMuller!

Bugfixes 🐛

  • Compare conditional expressions in MutatingScope::equals() (#6344), [#15157], thanks @janedbal!
  • Fix containsNull() for union with null&T of mixed (#6390), thanks @vojtech-dobes!
  • Do not resolve include paths through a stream wrapper that is not registered (#6397), [#15192]
  • Do not treat mixed type arguments as compatible both ways when both generic types are parameterized (#6398), [#15198]
  • Fix union of template array-key with false losing the template (#6376), [#13374], [#13192], [#10871], [#8268], [#7423], [#7279], [#7049], thanks @calebdw!
  • Fix false positive comparing identical generic types below level 8 (#6392), [#13876], [#12984], [#12008], [#11041], [#10698], [#9377], [#9096], thanks @calebdw!
  • pcntl_exec() is not supported by blackfire (#6409), thanks @staabm!
  • UsedNamesRule: reset imported names at every namespace declaration instead of keying them by namespace name (#6413), [#15215]
  • Derive per-arm conditional expressions from overlapping ternary arm types (#6381), [#7905]
  • Record needle-implies-true conditional expression for in_array() assignments (#6381), [#9752]
  • Propagate conditional expressions through derived assignments (#6381), [#13054]
  • Do not report ?? null / ??= null as unnecessary when evaluating the right side has side effects (#6418), [#15134], thanks @VincentLanglet and @staabm!

Performance 🏎️

  • Reduce repeated work when matching ignored errors (#6374), thanks @zonuexe!
  • Do not look up class reflection for properties without hooks (#6396)
  • Share the directory walk between the analyse and the scan file finder (#6396)
  • Read the exported PHPDoc scope off the AST instead of through FileTypeMapper (#6396)
  • Memoize ClassReflection::getName() (#6406)
  • Inline single-return getters when building the PHAR (#6406, #6412)
  • Remove a union of values from a set in one pass (#6427)
  • Key types by their value where describe() was standing in for it (#6427)
  • Answer reflection cache misses without a failing include() (#6430)

Function signature fixes 🤖

  • Locale::getPrimaryLanguage() can return empty string (#6400), thanks @BenMorel!

Internals 🔍

  • Fix PHPUnit warning (#6375), thanks @staabm!
  • Trust PHPStan's own types when running from a source checkout too (#6406)
  • Build the macOS turbo extension for arm64 only (#6407)
Source: README.md, updated 2026-09-12