diff --git a/src/Rules/Classes/NewStaticInAbstractClassStaticMethodRule.php b/src/Rules/Classes/NewStaticInAbstractClassStaticMethodRule.php index 0b2842648b..bdaab03c7b 100644 --- a/src/Rules/Classes/NewStaticInAbstractClassStaticMethodRule.php +++ b/src/Rules/Classes/NewStaticInAbstractClassStaticMethodRule.php @@ -49,6 +49,15 @@ public function processNode(Node $node, Scope $scope): array return []; } + if ($classReflection->hasConstructor()) { + $constructor = $classReflection->getConstructor(); + if ( + $constructor->isFinal()->yes() + ) { + return []; + } + } + return [ RuleErrorBuilder::message(sprintf( 'Unsafe usage of new static() in abstract class %s in static method %s().', diff --git a/tests/PHPStan/Rules/Classes/data/new-static-in-abstract-class-static-method.php b/tests/PHPStan/Rules/Classes/data/new-static-in-abstract-class-static-method.php index bbcfea8ef8..890fe7f790 100644 --- a/tests/PHPStan/Rules/Classes/data/new-static-in-abstract-class-static-method.php +++ b/tests/PHPStan/Rules/Classes/data/new-static-in-abstract-class-static-method.php @@ -31,3 +31,23 @@ public static function staticDoFoo(): void } } + +abstract class FinalConstructFoo +{ + final function __construct() { + + } + + public function doFoo(): void + { + new static(); + } + + public static function staticDoFoo(): void + { + new static(); + } + +} + +class Subclass extends FinalConstructFoo {}