From d41f4f857c74427822af178e48a3528a1bec2e9b Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 20 Feb 2026 17:19:33 +0100 Subject: [PATCH 1/4] Cover dynamic static calls in tests --- ...hodStatementWithoutSideEffectsRuleTest.php | 5 +++ .../Methods/data/dynamic-static-call.php | 38 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 tests/PHPStan/Rules/Methods/data/dynamic-static-call.php diff --git a/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php b/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php index f9e047e2959..f8088b412ff 100644 --- a/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php +++ b/tests/PHPStan/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRuleTest.php @@ -121,6 +121,11 @@ public function testBug10819(): void $this->analyse([__DIR__ . '/data/bug-10819.php'], $errors); } + public function testDynamicStaticCall(): void + { + $this->analyse([__DIR__ . '/data/dynamic-static-call.php'], []); + } + #[RequiresPhp('>= 8.5')] public function testPipeOperator(): void { diff --git a/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php new file mode 100644 index 00000000000..54b59a4fcc2 --- /dev/null +++ b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php @@ -0,0 +1,38 @@ + Date: Fri, 20 Feb 2026 17:26:36 +0100 Subject: [PATCH 2/4] Update dynamic-static-call.php --- tests/PHPStan/Rules/Methods/data/dynamic-static-call.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php index 54b59a4fcc2..57db55a66ee 100644 --- a/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php +++ b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php @@ -2,8 +2,6 @@ namespace DynamicStaticCall; -class SomeClass {} - class Foo { /** @phpstan-pure */ static public function doFoo():int From 09c0a7503392ce0f4a0eda81999de8e451bbb1e4 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 20 Feb 2026 17:29:18 +0100 Subject: [PATCH 3/4] Update dynamic-static-call.php --- tests/PHPStan/Rules/Methods/data/dynamic-static-call.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php index 57db55a66ee..0312492a60b 100644 --- a/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php +++ b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php @@ -29,8 +29,8 @@ final static public function finalFoo():int class Baz { function doBaz(Foo $foo, FinalFoo $finalFoo, Bar $bar):void { - $foo::doFoo(); - $finalFoo::doFoo(); - $bar::finalFoo(); + $foo::doFoo(); // no error, subclass could override static method with impure impl + $finalFoo::doFoo(); // could error, because final class + $bar::finalFoo(); // could error, because final method } } From b619be121e5b1af142673c4562ecfa9ee983492e Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 20 Feb 2026 17:30:40 +0100 Subject: [PATCH 4/4] Update dynamic-static-call.php --- tests/PHPStan/Rules/Methods/data/dynamic-static-call.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php index 0312492a60b..b52e5df44d7 100644 --- a/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php +++ b/tests/PHPStan/Rules/Methods/data/dynamic-static-call.php @@ -30,7 +30,7 @@ final static public function finalFoo():int class Baz { function doBaz(Foo $foo, FinalFoo $finalFoo, Bar $bar):void { $foo::doFoo(); // no error, subclass could override static method with impure impl - $finalFoo::doFoo(); // could error, because final class - $bar::finalFoo(); // could error, because final method + $finalFoo::doFoo(); // could be "Call to static method .. on a separate line has no effect", because final class + $bar::finalFoo(); // could be "Call to static method .. on a separate line has no effect", because final method } }