Symfony\Component\ClassLoader\ClassCollectionLoader::inline PHP Method

inline() public static method

Generates a file where classes and their parents are inlined.
public static inline ( array $classes, string $cache, array $excluded ) : array
$classes array An array of classes to load
$cache string The file where classes are inlined
$excluded array An array of classes that won't be inlined
return array The source map of inlined classes, with classes as keys and files as values
    public static function inline($classes, $cache, array $excluded)
    {
        $declared = array();
        foreach (self::getOrderedClasses($excluded) as $class) {
            $declared[$class->getName()] = true;
        }
        // cache the core classes
        $cacheDir = dirname($cache);
        if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777, true) && !is_dir($cacheDir)) {
            throw new \RuntimeException(sprintf('Class Collection Loader was not able to create directory "%s"', $cacheDir));
        }
        $spacesRegex = '(?:\\s*+(?:(?:\\#|//)[^\\n]*+\\n|/\\*(?:(?<!\\*/).)++)?+)*+';
        $dontInlineRegex = <<<REGEX
            '(?:
               ^<\\?php\\s.declare.\\(.strict_types.=.1.\\).;
               | \\b__halt_compiler.\\(.\\)
               | \\b__(?:DIR|FILE)__\\b
            )'isx
REGEX;
        $dontInlineRegex = str_replace('.', $spacesRegex, $dontInlineRegex);
        $cacheDir = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $cacheDir));
        $files = array();
        $content = '';
        foreach (self::getOrderedClasses($classes) as $class) {
            if (isset($declared[$class->getName()])) {
                continue;
            }
            $declared[$class->getName()] = true;
            $files[$class->getName()] = $file = $class->getFileName();
            $c = file_get_contents($file);
            if (preg_match($dontInlineRegex, $c)) {
                $file = explode('/', str_replace(DIRECTORY_SEPARATOR, '/', $file));
                for ($i = 0; isset($file[$i], $cacheDir[$i]); ++$i) {
                    if ($file[$i] !== $cacheDir[$i]) {
                        break;
                    }
                }
                if (1 >= $i) {
                    $file = var_export(implode('/', $file), true);
                } else {
                    $file = array_slice($file, $i);
                    $file = str_repeat('../', count($cacheDir) - $i) . implode('/', $file);
                    $file = '__DIR__.' . var_export('/' . $file, true);
                }
                $c = "\nnamespace {require {$file};}";
            } else {
                $c = preg_replace(array('/^\\s*<\\?php/', '/\\?>\\s*$/'), '', $c);
                // fakes namespace declaration for global code
                if (!$class->inNamespace()) {
                    $c = "\nnamespace\n{\n" . $c . "\n}\n";
                }
                $c = self::fixNamespaceDeclarations('<?php ' . $c);
                $c = preg_replace('/^\\s*<\\?php/', '', $c);
            }
            $content .= $c;
        }
        self::writeCacheFile($cache, '<?php ' . $content);
        return $files;
    }

Usage Example

コード例 #1
0
 /**
  * Warms up the cache.
  *
  * @param string $cacheDir The cache directory
  */
 public function warmUp($cacheDir)
 {
     $classmap = $cacheDir . '/classes.map';
     if (!is_file($classmap)) {
         return;
     }
     if (file_exists($cacheDir . '/classes.php')) {
         return;
     }
     $declared = null !== $this->declaredClasses ? $this->declaredClasses : array_merge(get_declared_classes(), get_declared_interfaces(), get_declared_traits());
     ClassCollectionLoader::inline(include $classmap, $cacheDir . '/classes.php', $declared);
 }
All Usage Examples Of Symfony\Component\ClassLoader\ClassCollectionLoader::inline