Viewing file: ClassMapGenerator.php (3.46 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
/* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */
namespace Symfony\Component\ClassLoader;
/** * ClassMapGenerator * * @author Gyula Sallai <salla016@gmail.com> */ class ClassMapGenerator { /** * Generate a class map file * * @param array|string $dirs Directories or a single path to search in * @param string $file The name of the class map file */ public static function dump($dirs, $file) { $dirs = (array) $dirs; $maps = array();
foreach ($dirs as $dir) { $maps = array_merge($maps, static::createMap($dir)); }
file_put_contents($file, sprintf('<?php return %s;', var_export($maps, true))); }
/** * Iterate over all files in the given directory searching for classes * * @param \Iterator|string $dir The directory to search in or an iterator * * @return array A class map array */ public static function createMap($dir) { if (is_string($dir)) { $dir = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir)); }
$map = array();
foreach ($dir as $file) { if (!$file->isFile()) { continue; }
$path = $file->getRealPath();
if (pathinfo($path, PATHINFO_EXTENSION) !== 'php') { continue; }
$classes = self::findClasses($path);
foreach ($classes as $class) { $map[$class] = $path; }
}
return $map; }
/** * Extract the classes in the given file * * @param string $path The file to check * * @return array The found classes */ private static function findClasses($path) { $contents = file_get_contents($path); $tokens = token_get_all($contents); $T_TRAIT = version_compare(PHP_VERSION, '5.4', '<') ? -1 : T_TRAIT;
$classes = array();
$namespace = ''; for ($i = 0, $max = count($tokens); $i < $max; $i++) { $token = $tokens[$i];
if (is_string($token)) { continue; }
$class = '';
switch ($token[0]) { case T_NAMESPACE: $namespace = ''; // If there is a namespace, extract it while (($t = $tokens[++$i]) && is_array($t)) { if (in_array($t[0], array(T_STRING, T_NS_SEPARATOR))) { $namespace .= $t[1]; } } $namespace .= '\\'; break; case T_CLASS: case T_INTERFACE: case $T_TRAIT: // Find the classname while (($t = $tokens[++$i]) && is_array($t)) { if (T_STRING === $t[0]) { $class .= $t[1]; } elseif ($class !== '' && T_WHITESPACE == $t[0]) { break; } }
$classes[] = ltrim($namespace.$class, '\\'); break; default: break; } }
return $classes; } }
|