Access PHPStan changelog updates through our uniform API. Same JSON structure across all sources — no adapter-specific parsing needed.
GET https://watchchangelog.com/api/v1/entries?source=phpstan.releases{
"source": "phpstan.releases",
"vendor": "PHPStan",
"id": "tag:github.com,2008:Repository/49014795/2.2.9",
"published_at": "2026-08-22T07:39:37.000Z",
"title": "2.2.9",
"url": "https://github.com/phpstan/phpstan/releases/tag/2.2.9",
"summary": "Improvements 🔧 Store result cache paths relative to the install location ( #6190 ), #8599 Bugfixes 🐛 Do not treat conditional-expression entries about a property fetch as proof it is initialized ( #6183 ), #15046 , thanks @staabm and @VincentLanglet ! Run bootstrap-registered autoloaders inside the file-read trap ( #6185 ), #14988 , thanks @SanderMuller ! Consult bootstrap-registered custom autoloaders only after the static source locators ( #6069 ), #14976 , thanks @staabm ! Do not remember constructor property initialization for classes with custom serialization ( #6188 ), #15056 , thanks @staabm ! Avoid warning about non-nullable class-property in traits. ( #6100 ), #14416 , thanks @peter17 ! An optional non-list key makes isList Maybe, not No ( #6025 ), #14938 , thanks @zonuexe ! Normalize double and single quotes in offset keys, to remember them with the same node-key ( #6196 ), #15060 , thanks @staabm and @SanderMuller ! Preserve constant array shape when spreading a union of constant arrays in array literals ( #5774 ), #14708 , thanks @staabm ! Enter closure and arrow function scopes without re-walking the body ( #6211 ), #14914 Key the closure type cache by the closure's actual inputs ( #6211 ), #14914 Do not remember conditional expressions about precisely resolved class constants ( #6212 ), #14478 , thanks @SanderMuller ! Collapse ObjectShapeType against HasPropertyType regardless of member order ( #6184 ), #15047 , thanks @SanderMuller ! Pin the iteratee's entry types in the by-ref foreach intertwined expression ( #6217 ), #13789 , #13802 Compute integer range bounds for bitwise AND, OR, XOR, and NOT on IntegerRangeType ( #5771 ), #14654 , thanks @staabm and @SanderMuller ! Require array_search()'s haystack argument before reading it ( #6239 ), thanks @SanderMuller ! Do not restrict @internal usages of anonymous class members ( #6235 ), #13042 , thanks @peter17 ! Performance 🏎️ TypeCombinator: remove unnecessary iteration over types ( #6194 ), thanks @staabm ! Faster HasOffsetType , HasOffsetValueType intersection ( #6195 ), #15061 , thanks @staabm ! DynamicReturnTypeExtensionRegistry: Cache extension-class-names ( #6203 ), thanks @staabm ! Rules\\LazyRegistry , Collectors\\Registry : Cache extension-class-names ( #6205 ), thanks @staabm ! src/Rules/Api/*Rule : cheap checks first ( #6206 ), thanks @staabm ! Faster UnionType->getFiniteTypes() ( #6210 ), thanks @staabm ! Skip loop verification passes whose entry scope did not change ( #6215 ) Release each file's resolved closure types when its analysis ends ( #6216 ) Skip fiber machinery for noop node callbacks ( #6218 ) Faster FiniteTypeSet->key() ( #6228 ), thanks @staabm ! Faster UnionType->isNull() ( #6232 ), thanks @staabm ! Faster UnionType->isCallable() ( #6233 ), thanks @staabm ! Memoize file contents by path in CachedParser to skip redundant reads ( #5928 ), thanks @SanderMuller ! Function signature fixes 🤖 uniqid: Tighten return type to non-falsy-string ( #6242 ), thanks @tkw1536 ! Internals 🔍 Accept the shared data provider's third argument in testOverridingFinalMethod ( #6193 ), thanks @SanderMuller ! Fix incomplete version requirements in tests ( #6198 ), thanks @staabm ! Removed duplicate code ( #6200 ), thanks @staabm ! Carry the closure body walk's gathered statements on ProcessClosureResult ( #6169 ) Restructure ClosureTypeResolver around single-walk closure type builders ( #6169 ) Seed the closure type cache from the handler's single body walk ( #6169 ) Seed the arrow function type cache from the handler's single body walk ( #6169 ) Seed the closure type cache from the call-argument body walks ( #6169 ) Walk closure by-ref convergence passes in deep statement context ( #6208 ) Extract the statement-list loop into doProcessStmtNodes() ( #6215 ) Replace TypeSpecifyingFunctionsDynamicReturnTypeExtension with direct code in FuncCallHandler ( #6221 ) Refuse to commit a torn turbo binary set to the dist repository ( #6225 ) Move repeated @internal logic into RestrictedInternalUsageHelper ( #6230 ), thanks @staabm ! Simplify FiniteTypeSet ( #6229 ), thanks @staabm ! Extract the shared parameter-out type comparison into ParameterOutTypeCheck ( #6238 ), thanks @SanderMuller !",
"tags": [
"PHPStan",
"phpstan.releases",
"static-analysis",
"php",
"type-checker"
]
}+2 more
+2 more
+2 more
+2 more