public static classes ( array $options = [] ) : array | ||
$options | array | Option consists of: - `'group'`: Can be `classes` for grouping by class name or `files` for grouping by filename. - `'file': Valid file path for inspecting the containing classes. |
return | array | Associative of classes and their corresponding definition files |
public static function classes(array $options = array())
{
$defaults = array('group' => 'classes', 'file' => null);
$options += $defaults;
$list = get_declared_classes();
$files = get_included_files();
$classes = array();
if ($file = $options['file']) {
$loaded = static::_instance('collection', array('data' => array_map(function ($class) {
return new ReflectionClass($class);
}, $list)));
$classFiles = $loaded->getFileName();
if (in_array($file, $files) && !in_array($file, $classFiles)) {
return array();
}
if (!in_array($file, $classFiles)) {
include $file;
$list = array_diff(get_declared_classes(), $list);
} else {
$filter = function ($class) use($file) {
return $class->getFileName() === $file;
};
$list = $loaded->find($filter)->map(function ($class) {
return $class->getName() ?: $class->name;
}, array('collect' => false));
}
}
foreach ($list as $class) {
$inspector = new ReflectionClass($class);
if ($options['group'] === 'classes') {
$inspector->getFileName() ? $classes[$class] = $inspector->getFileName() : null;
} elseif ($options['group'] === 'files') {
$classes[$inspector->getFileName()][] = $inspector;
}
}
return $classes;
}
/** * Helper method for caching closure function references to help the process of building the * stack trace. * * @param array $frame Backtrace information. * @param callable|string $function The method related to $frame information. * @return string Returns either the cached or the fetched closure function reference while * writing its reference to the cache array `$_closureCache`. */ protected static function _closureDef($frame, $function) { $reference = '::'; $frame += array('file' => '??', 'line' => '??'); $cacheKey = "{$frame['file']}@{$frame['line']}"; if (isset(static::$_closureCache[$cacheKey])) { return static::$_closureCache[$cacheKey]; } if ($class = Inspector::classes(array('file' => $frame['file']))) { foreach (Inspector::methods(key($class), 'extents') as $method => $extents) { $line = $frame['line']; if (!($extents[0] <= $line && $line <= $extents[1])) { continue; } $class = key($class); $reference = "{$class}::{$method}"; $function = "{$reference}()::{closure}"; break; } } else { $reference = $frame['file']; $function = "{$reference}::{closure}"; } $line = static::_definition($reference, $frame['line']) ?: '?'; $function .= " @ {$line}"; return static::$_closureCache[$cacheKey] = $function; }