| Name | Modified | Size | Downloads / Week |
|---|---|---|---|
| Parent folder | |||
| phpstan.phar | 2026-07-29 | 27.9 MB | |
| phpstan.phar.asc | 2026-07-29 | 833 Bytes | |
| 2.2.7 source code.tar.gz | 2026-07-29 | 11.9 MB | |
| 2.2.7 source code.zip | 2026-07-29 | 11.9 MB | |
| README.md | 2026-07-29 | 5.4 kB | |
| Totals: 5 Items | 51.7 MB | 0 | |
Bugfixes 🐛
- Preserve maybe-certainty only for
Variablewhen narrowing the base of?->,??,isset()andempty()(#6109), [#15002], thanks @staabm and @VincentLanglet! - Do not key the container cache on the turbo extension state (#6121)
- Fill the missing gaps in expr processing (https://github.com/phpstan/phpstan-src/commit/eea2788d99ce05adb104fef837479d3e5aefe9fb)
- Resolve a relative include against the trait file in a trait context (#6127), thanks @zonuexe!
- Do not let type narrowing define a certainly-undefined variable (#6130), [#2032]
- Merge all callable acceptors' parameters into
NativeParameterReflectionwhen a closure is passed to a union of callables (#6128), [#15003], thanks @staabm and @VincentLanglet! - Treat a property with a default value as always set in isset resolution (#6131), [#10786]
- Read already-processed expression types from ExpressionResults in NodeScopeResolver (#6139), [#13253]
- Resolve
__DIR__and__FILE__against the trait file in a trait context (#6126), [#15015], thanks @zonuexe!
Performance 🏎️
- Reuse the scope factory of the other flavour (#6114)
- Remember chain levels that shortcircuit to themselves (https://github.com/phpstan/phpstan-src/commit/ab11f34fe8c74921f277d1213858b80e0888e86d), [#14991]
- Prevent unnecessary re-creation of union types (#6117), thanks @staabm!
- Remember an expression's printed form as the printer produces it (#6118), [#14991]
- Prevent unnecessary re-creation of benevolent union types (#6119), thanks @staabm!
- Resume expression-asking fibers with ExpressionResults (https://github.com/phpstan/phpstan-src/commit/9725942bdd0523126e74bbf5741a8b7a147bda47)
- Create merge conditionals from the differing holders only (#6141)
Internals 🔍
- ExprHandlerRegistry does not need to be AutowiredService (https://github.com/phpstan/phpstan-src/commit/36392ba9ddee9ec8cb6b6fb2c589bdad56cae802)
- Repeat a shadowed class's interfaces on its stub shell (#6113)
- Run the benchmark on PHP 7.4 in addition to PHP 8.5 (#6121)
- Check
bench/datafiles with RequiredPhpVersionCommentTest (#6122), thanks @staabm! - Introduce ExpressionResultFactory (https://github.com/phpstan/phpstan-src/commit/8f5111fc6e2303497d615a74ca46f578b8d4f3e3)
- ExpressionResult - add beforeScope (https://github.com/phpstan/phpstan-src/commit/a7094b5bc0d3aa67a2f8fcfbbf3f35ebb7a64fa2)
- ExpressionResult - add Expr (https://github.com/phpstan/phpstan-src/commit/abcce5613c8d03bd816f0efeb3cc09d1685e5023)
- Eliminate the OriginalPropertyTypeExpr virtual node (#6129)
- Eliminate the GetOffsetValueTypeExpr virtual node (#6129)
- Eliminate the GetIterableKeyTypeExpr virtual node (#6129)
- Eliminate the GetIterableValueTypeExpr virtual node (#6129)
- Deduplicate constant-condition vs impossible-check reports via collectors instead of asking the type specifier inline (#6132)
- Replace
SpecifiedTypes::normalize()with symbolic alternative-form entries (#6133) - Resolve early-terminating calls to an explicit never type in the call handlers (#6134)
- Read operand types from ExpressionResults in Throw/BooleanAnd/Coalesce handlers (#6135)
- Read operand types from ExpressionResults in Ternary/ArrayDimFetch/PropertyFetch handlers (#6136)
- Read operand types from ExpressionResults in BinaryOp/BooleanOr/MethodCall/Match handlers (#6137)
- Read expression types from ExpressionResults in NodeScopeResolver and handlers (#6138)
- Fill the foreach key-loop native types with the native flavour (#6141)
- Run engine-feeding node-callback gatherers synchronously at the emission position (#6142)
- Track containsNullsafe on ExpressionResult and propagate it through fetch/call chains (#6143)