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