lithium\analysis\Inspector::classes PHP Method

classes() public static method

Gets an array of classes and their corresponding definition files, or examines a file and returns the classes it defines.
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;
    }

Usage Example

Example #1
0
 /**
  * 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;
 }
All Usage Examples Of lithium\analysis\Inspector::classes