Chris@13: finalClasses = []; Chris@13: } Chris@13: Chris@13: /** Chris@13: * @throws RuntimeException if the node is a class that extends a final class Chris@13: * Chris@13: * @param Node $node Chris@13: */ Chris@13: public function enterNode(Node $node) Chris@13: { Chris@13: if ($node instanceof Class_) { Chris@13: if ($node->extends) { Chris@13: $extends = (string) $node->extends; Chris@13: if ($this->isFinalClass($extends)) { Chris@17: $msg = \sprintf('Class %s may not inherit from final class (%s)', $node->name, $extends); Chris@13: throw new FatalErrorException($msg, 0, E_ERROR, null, $node->getLine()); Chris@13: } Chris@13: } Chris@13: Chris@13: if ($node->isFinal()) { Chris@17: $this->finalClasses[\strtolower($node->name)] = true; Chris@13: } Chris@13: } Chris@13: } Chris@13: Chris@13: /** Chris@13: * @param string $name Class name Chris@13: * Chris@13: * @return bool Chris@13: */ Chris@13: private function isFinalClass($name) Chris@13: { Chris@17: if (!\class_exists($name)) { Chris@17: return isset($this->finalClasses[\strtolower($name)]); Chris@13: } Chris@13: Chris@13: $refl = new \ReflectionClass($name); Chris@13: Chris@13: return $refl->isFinal(); Chris@13: } Chris@13: }