MINOR Documented ClassInfo::subclassesFor() and added unit tests

git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/sapphire/branches/2.3@67689 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
Ingo Schommer 2008-12-08 01:41:19 +00:00 committed by Sam Minnee
parent b2c88c2f5b
commit d9b3abf8ac
2 changed files with 56 additions and 3 deletions

View File

@ -101,16 +101,36 @@ class ClassInfo {
/**
* Returns a list of classes that inherit from the given class.
* The resulting array includes the base class passed
* through the $class parameter as the first array value.
*
* Example usage:
* <example>
* ClassInfo::subclassesFor('BaseClass');
* array(
* 0 => 'BaseClass',
* 'ChildClass' => 'ChildClass',
* 'GrandChildClass' => 'GrandChildClass'
* )
* </example>
*
* @param mixed $class string of the classname or instance of the class
* @return array
* @return array Names of all subclasses as an associative array.
*/
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;
if(isset($subclasses)) array_unshift($subclasses, $class);
else $subclasses[$class] = $class;
// add the base class to the array
if(isset($subclasses)) {
array_unshift($subclasses, $class);
} else {
$subclasses[$class] = $class;
}
return $subclasses;
}

33
tests/ClassInfoTest.php Normal file
View File

@ -0,0 +1,33 @@
<?php
/**
* @package sapphire
* @subpackage tests
*/
class ClassInfoTest extends SapphireTest {
function testSubclassesFor() {
$this->assertEquals(
ClassInfo::subclassesFor('ClassInfoTest_BaseClass'),
array(
0 => 'ClassInfoTest_BaseClass',
'ClassInfoTest_ChildClass' => 'ClassInfoTest_ChildClass',
'ClassInfoTest_GrandChildClass' => 'ClassInfoTest_GrandChildClass'
),
'ClassInfo::subclassesFor() returns only direct subclasses and doesnt include base class'
);
}
}
class ClassInfoTest_BaseClass {
}
class ClassInfoTest_ChildClass extends ClassInfoTest_BaseClass {
}
class ClassInfoTest_GrandChildClass extends ClassInfoTest_ChildClass {
}
?>