classAnalyzer = $classAnalyzer; } public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition { return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Change get_called_class() to self::class on final class', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE' final class SomeClass { public function callOnMe() { var_dump(get_called_class()); } } CODE_SAMPLE , <<<'CODE_SAMPLE' final class SomeClass { public function callOnMe() { var_dump(self::class); } } CODE_SAMPLE )]); } /** * @return array> */ public function getNodeTypes() : array { return [\PhpParser\Node\Expr\FuncCall::class]; } /** * @param FuncCall $node */ public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node { if (!$this->isName($node, 'get_called_class')) { return null; } $class = $this->betterNodeFinder->findParentType($node, \PhpParser\Node\Stmt\Class_::class); if (!$class instanceof \PhpParser\Node\Stmt\Class_) { return null; } if ($class->isFinal()) { return $this->nodeFactory->createClassConstFetch(\Rector\Core\Enum\ObjectReference::SELF(), 'class'); } if ($this->classAnalyzer->isAnonymousClass($class)) { return $this->nodeFactory->createClassConstFetch(\Rector\Core\Enum\ObjectReference::SELF(), 'class'); } return null; } public function provideMinPhpVersion() : int { return \Rector\Core\ValueObject\PhpVersionFeature::CLASSNAME_CONSTANT; } }