From 803e67b87d9296bed3926deecde553e1e6ce424f Mon Sep 17 00:00:00 2001 From: ajshort Date: Mon, 21 Feb 2011 16:16:52 +1100 Subject: [PATCH] API CHANGE: Refactored ClassInfo::subclassesFor() to traverse the child tree, rather than needing to store a list of every classes descendants. API CHANGE: Updated ClassInfo::subclassesFor() so all the array keys are consistently the same as the values. --- core/ClassInfo.php | 34 ++++++++++++++++++++++------------ tests/ClassInfoTest.php | 2 +- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/core/ClassInfo.php b/core/ClassInfo.php index b371f9682..e1e3d5a18 100644 --- a/core/ClassInfo.php +++ b/core/ClassInfo.php @@ -125,21 +125,31 @@ class ClassInfo { * @param mixed $class string of the classname or instance of the class * @return array Names of all subclasses as an associative array. */ - static function subclassesFor($class){ + public static function subclassesFor($class) { global $_ALL_CLASSES; - if (is_object($class)) $class = get_class($class); - - // get all classes from the manifest - $subclasses = isset($_ALL_CLASSES['children'][$class]) ? $_ALL_CLASSES['children'][$class] : null; - // add the base class to the array - if(isset($subclasses)) { - array_unshift($subclasses, $class); - } else { - $subclasses[$class] = $class; + if (is_object($class)) { + $class = get_class($class); } - - return $subclasses; + + $parents = array($class); + $classes = array($class => $class); + + if (!isset($_ALL_CLASSES['children'][$class])) { + return $classes; + } + + while ($parent = array_shift($parents)) { + foreach ($_ALL_CLASSES['children'][$parent] as $class) { + $classes[$class] = $class; + + if (isset($_ALL_CLASSES['children'][$class])) { + $parents[] = $class; + } + } + } + + return $classes; } /** diff --git a/tests/ClassInfoTest.php b/tests/ClassInfoTest.php index f11d454fb..bc3c49daa 100644 --- a/tests/ClassInfoTest.php +++ b/tests/ClassInfoTest.php @@ -9,7 +9,7 @@ class ClassInfoTest extends SapphireTest { $this->assertEquals( ClassInfo::subclassesFor('ClassInfoTest_BaseClass'), array( - 0 => 'ClassInfoTest_BaseClass', + 'ClassInfoTest_BaseClass' => 'ClassInfoTest_BaseClass', 'ClassInfoTest_ChildClass' => 'ClassInfoTest_ChildClass', 'ClassInfoTest_GrandChildClass' => 'ClassInfoTest_GrandChildClass' ),