Skip to content

Conversation

@staabm
Copy link
Contributor

@staabm staabm commented Jul 23, 2025

@staabm staabm marked this pull request as ready for review July 23, 2025 09:01
@phpstan-bot
Copy link
Collaborator

This pull request has been marked as ready for review.

@staabm
Copy link
Contributor Author

staabm commented Jul 28, 2025

@liamduckett I just realized that the fix of this PR produces a false-positive (see the newly added testcase).
I do not yet know how to fix the initial problem without also regressing the other example.

just to let you know, as #4153 has the same problem

@staabm staabm marked this pull request as draft July 28, 2025 06:30
Comment on lines +12 to +14
if (!method_exists($bar, $method)) {
throw new \Exception;
}
Copy link
Contributor Author

@staabm staabm Jul 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the we could build a better type in a TypeSpecifyingExtension if the TypeSpecifierContext would contain information, whether the context is always-terminating.

@liamduckett
Copy link

@liamduckett I just realized that the fix of this PR produces a false-positive (see the newly added testcase). I do not yet know how to fix the initial problem without also regressing the other example.

just to let you know, as #4153 has the same problem

Thanks. I'm not sure I understand the new test case (probably due to my inexperience) - why would $bar being narrowed here, be a problem?

@staabm
Copy link
Contributor Author

staabm commented Jul 29, 2025

the initial types were wrongly narrowed:

/** * @param 'quux'|'qux' $constUnion */ function fooBar(object $bar, string $constUnion): void {	if (!method_exists($bar, $constUnion)) {	throw new \Exception;	} // $bar does not have both methods, it has only either 'quux' or 'qux' but not both } 

while in the initial loop check example it is correct that $bar will have both methods at once:

foreach (['qux', 'quux'] as $method) {	assertType("'quux'|'qux'", $method);	if (!method_exists($bar, $method)) {	throw new \Exception;	} } 
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

3 participants