public static dependencies ( mixed $classes, array $options = [] ) : array | ||
$classes | mixed | Either a string specifying a class, or a numerically indexed array of classes |
$options | array | Option consists of: - `'type'`: The type of dependency to check: `static` for static dependencies, `dynamic`for dynamic dependencies or `null` for both merged in the same array. Defaults to `null`. |
return | array | An array of the static and dynamic class dependencies or each if `type` is defined in $options. |
public static function dependencies($classes, array $options = array())
{
$defaults = array('type' => null);
$options += $defaults;
$static = $dynamic = array();
$trim = function ($c) {
return trim(trim($c, '\\'));
};
$join = function ($i) {
return join('', $i);
};
foreach ((array) $classes as $class) {
$data = explode("\n", file_get_contents(Libraries::path($class)));
$data = "<?php \n" . join("\n", preg_grep('/^\\s*use /', $data)) . "\n ?>";
$classes = array_map($join, Parser::find($data, 'use *;', array('return' => 'content', 'lineBreaks' => true, 'startOfLine' => true, 'capture' => array('T_STRING', 'T_NS_SEPARATOR'))));
if ($classes) {
$static = array_unique(array_merge($static, array_map($trim, $classes)));
}
$classes = static::info($class . '::$_classes', array('value'));
if (isset($classes['value'])) {
$dynamic = array_merge($dynamic, array_map($trim, array_values($classes['value'])));
}
}
if (empty($options['type'])) {
return array_unique(array_merge($static, $dynamic));
}
$type = $options['type'];
return isset(${$type}) ? ${$type} : null;
}
/** * Returns all classes directly depending on a given class. * * @param string $dependency The class name to use as a dependency. * @param string $exclude Regex path exclusion filter. * @return array Classes having a direct dependency on `$dependency`. May contain duplicates. */ protected static function _affected($dependency, $exclude = null) { $exclude = $exclude ?: '/(tests|webroot|resources|libraries|plugins)/'; $classes = Libraries::find(true, compact('exclude') + array('recursive' => true)); $dependency = ltrim($dependency, '\\'); $affected = array(); foreach ($classes as $class) { if (isset(static::$_cachedDepends[$class])) { $depends = static::$_cachedDepends[$class]; } else { $depends = Inspector::dependencies($class); $depends = array_map(function ($c) { return ltrim($c, '\\'); }, $depends); static::$_cachedDepends[$class] = $depends; } if (in_array($dependency, $depends)) { $affected[] = $class; } } return $affected; }