Example #1
0
/**
 * Gets full class names tree, recursively
 *
 * @param $object     object|string object or class name or interface name or trait name
 * @param $classes    boolean get parent classes list
 * @param $traits     boolean get parent traits list
 * @param $interfaces boolean get parent interfaces list
 * @param $self       boolean get the object / class name itself
 * @return string[] keys and values are classes / traits / interfaces names
 */
function classTree($object, $classes = true, $traits = true, $interfaces = true, $self = true)
{
    $class_name = is_object($object) ? get_class($object) : $object;
    $tree = [];
    if ($classes) {
        $parent = get_parent_class($class_name);
        if (isset($parent)) {
            $tree = array_merge($tree, [$parent => $parent]);
        }
    }
    if ($traits) {
        $parents = class_uses($class_name);
        $tree = array_merge($tree, array_combine($parents, $parents));
    }
    if ($interfaces) {
        $parents = class_implements($class_name);
        $tree = array_merge($tree, array_combine($parents, $parents));
    }
    foreach ($tree as $parent) {
        $tree = array_merge($tree, classTree($parent, $classes, $traits, $interfaces, false));
    }
    if ($self) {
        $tree[$class_name] = $class_name;
    }
    return $tree;
}
Example #2
0
 /**
  * Gets restrictions list for a given class name
  *
  * @param $class_name
  * @return array
  */
 private function getRestrictions($class_name)
 {
     if (isset($this->final_restrictions[$class_name])) {
         $restrictions = $this->final_restrictions[$class_name];
     } else {
         $restrictions = [];
         foreach (classTree($class_name) as $tree_class_name) {
             if (isset($this->restrictions[$tree_class_name])) {
                 $restrictions = array_merge($restrictions, $this->restrictions[$tree_class_name]);
             }
         }
         $this->final_restrictions[$class_name] = $restrictions;
     }
     return $restrictions;
 }