Do not generalize class-string during template type inference #1038
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This prevents generalization of
class-stringtypes during template type inference.Fixes phpstan/phpstan#6505
Note:
I'm now wondering if we should generalize inferred types at all. Generalization allows expressions such as
new Foo(1)to be inferred asFoo<int>rather thanFoo<1>, which is useful. However, sometimes we may actually want aFoo<1>, and the current behavior makes this impossible.It could be useful to be able to create a
Foo<non-empty-string>, aFoo<numeric-string>, or aFoo<int<100,200>>.If we stopped generalizing at all, a
new Foo(1)would infer toFoo<1>, andnew Collection([1,2,3])would infer toCollection<1|2|3>, which is less useful in most case, but it gives the control to the user. The user would be able to generalize the type manually, like this:or like this: