Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/ClassLoader/ClassMapGenerator.php
Строк: 87
<?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 SymfonyComponentClassLoader;

if (!
defined('SYMFONY_TRAIT')) {
    if (
PHP_VERSION_ID >= 50400) {
        
define('SYMFONY_TRAIT'T_TRAIT);
    } else {
        
define('SYMFONY_TRAIT'0);
    }
}

/**
 * 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($filesprintf('<?php return %s;'var_export($mapstrue)));
    }

    
/**
     * 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($pathPATHINFO_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);

        
$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_STRINGT_NS_SEPARATOR))) {
                            
$namespace .= $t[1];
                        }
                    }
                    
$namespace .= '\';
                    break;
                case T_CLASS:
                case T_INTERFACE:
                case SYMFONY_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;
    }
}
Онлайн: 0
Реклама