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