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;
}