Chris@0: primeCache($filename, $className); Chris@0: return $this->cached($filename, $className); Chris@0: } Chris@0: Chris@0: protected function cached($filename, $className) Chris@0: { Chris@0: return isset($this->classCache[$filename][$className]) ? $this->classCache[$filename][$className] : $className; Chris@0: } Chris@0: Chris@0: protected function primeCache($filename, $className) Chris@0: { Chris@0: // If the cache has already been primed, do no further work Chris@0: if (isset($this->namespaceCache[$filename])) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: $handle = fopen($filename, "r"); Chris@0: if (!$handle) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: $namespaceName = $this->primeNamespaceCache($filename, $handle); Chris@0: $this->primeUseCache($filename, $handle); Chris@0: Chris@0: // If there is no 'use' statement for the className, then Chris@0: // generate an effective classname from the namespace Chris@0: if (!isset($this->classCache[$filename][$className])) { Chris@0: $this->classCache[$filename][$className] = $namespaceName . '\\' . $className; Chris@0: } Chris@0: Chris@0: fclose($handle); Chris@0: } Chris@0: Chris@0: protected function primeNamespaceCache($filename, $handle) Chris@0: { Chris@0: $namespaceName = $this->readNamespace($handle); Chris@0: if (!$namespaceName) { Chris@0: return false; Chris@0: } Chris@0: $this->namespaceCache[$filename] = $namespaceName; Chris@0: return $namespaceName; Chris@0: } Chris@0: Chris@0: protected function primeUseCache($filename, $handle) Chris@0: { Chris@0: $usedClasses = $this->readUseStatements($handle); Chris@0: if (empty($usedClasses)) { Chris@0: return false; Chris@0: } Chris@0: $this->classCache[$filename] = $usedClasses; Chris@0: } Chris@0: Chris@0: protected function readNamespace($handle) Chris@0: { Chris@0: $namespaceRegex = '#^\s*namespace\s+#'; Chris@0: $line = $this->readNextRelevantLine($handle); Chris@0: if (!$line || !preg_match($namespaceRegex, $line)) { Chris@0: return false; Chris@0: } Chris@0: Chris@0: $namespaceName = preg_replace($namespaceRegex, '', $line); Chris@0: $namespaceName = rtrim($namespaceName, ';'); Chris@0: return $namespaceName; Chris@0: } Chris@0: Chris@0: protected function readUseStatements($handle) Chris@0: { Chris@0: $useRegex = '#^\s*use\s+#'; Chris@0: $result = []; Chris@0: while (true) { Chris@0: $line = $this->readNextRelevantLine($handle); Chris@0: if (!$line || !preg_match($useRegex, $line)) { Chris@0: return $result; Chris@0: } Chris@0: $usedClass = preg_replace($useRegex, '', $line); Chris@0: $usedClass = rtrim($usedClass, ';'); Chris@0: $unqualifiedClass = preg_replace('#.*\\\\#', '', $usedClass); Chris@0: // If this is an aliased class, 'use \Foo\Bar as Baz', then adjust Chris@0: if (strpos($usedClass, ' as ')) { Chris@0: $unqualifiedClass = preg_replace('#.*\sas\s+#', '', $usedClass); Chris@17: $usedClass = preg_replace('#[a-zA-Z0-9]+\s+as\s+#', '', $usedClass); Chris@0: } Chris@0: $result[$unqualifiedClass] = $usedClass; Chris@0: } Chris@0: } Chris@0: Chris@0: protected function readNextRelevantLine($handle) Chris@0: { Chris@0: while (($line = fgets($handle)) !== false) { Chris@0: if (preg_match('#^\s*\w#', $line)) { Chris@0: return trim($line); Chris@0: } Chris@0: } Chris@0: return false; Chris@0: } Chris@0: }