00001 <?php
00002
00015 if ($argc < 2) {
00016 echo <<<EOF
00017 Usage: php ${_SERVER['PHP_SELF']} <class>
00018
00019 Displays a graphical tree for the given <class>.
00020
00021 <class> The class or interface for which to generate the tree graph.
00022
00023
00024 EOF;
00025 exit(1);
00026 }
00027
00028 if (!class_exists("RecursiveTreeIterator", false)) require_once("recursivetreeiterator.inc");
00029
00032 class SubClasses extends RecursiveArrayIterator
00033 {
00037 function __construct($base, $check_interfaces = false)
00038 {
00039 foreach(get_declared_classes() as $cname)
00040 {
00041 if (strcasecmp(get_parent_class($cname), $base) == 0)
00042 {
00043 $this->offsetSet($cname, new SubClasses($cname));
00044 }
00045 if ($check_interfaces)
00046 {
00047 foreach(class_implements($cname) as $iname)
00048 {
00049 if (strcasecmp($iname, $base) == 0)
00050 {
00051 $this->offsetSet($cname, new SubClasses($cname));
00052 }
00053 }
00054 }
00055 }
00056 if ($check_interfaces)
00057 {
00058 foreach(get_declared_interfaces() as $cname)
00059 {
00060 foreach(class_implements($cname) as $iname)
00061 {
00062 if (strcasecmp($iname, $base) == 0)
00063 {
00064 $this->offsetSet($cname, new SubClasses($cname, true));
00065 }
00066 }
00067 }
00068 }
00069 }
00070
00073 function current()
00074 {
00075 return parent::key();
00076 }
00077 }
00078
00079 $it = new RecursiveTreeIterator(new SubClasses($argv[1], true));
00080
00081 echo $argv[1]."\n";
00082 foreach($it as $c=>$v)
00083 {
00084 echo "$v\n";
00085 }
00086
00087 ?>