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-string
types 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: