diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/spl/examples/class_tree.php | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/spl/examples/class_tree.php')
-rwxr-xr-x | ext/spl/examples/class_tree.php | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/ext/spl/examples/class_tree.php b/ext/spl/examples/class_tree.php new file mode 100755 index 0000000..fc021d5 --- /dev/null +++ b/ext/spl/examples/class_tree.php @@ -0,0 +1,113 @@ +<?php + +/** @file class_tree.php + * @brief Class Tree example + * @ingroup Examples + * @author Marcus Boerger + * @date 2003 - 2008 + * @version 1.1 + * + * Usage: php class_tree.php \<class\> + * + * Simply specify the root class or interface to tree with parameter \<class\>. + */ + +if ($argc < 2) { + echo <<<EOF +Usage: php ${_SERVER['PHP_SELF']} <class> + +Displays a graphical tree for the given <class>. + +<class> The class or interface for which to generate the tree graph. + + +EOF; + exit(1); +} + +if (!class_exists("RecursiveTreeIterator", false)) require_once("recursivetreeiterator.inc"); + +/** \brief Collects sub classes for given class or interface + */ +class SubClasses extends RecursiveArrayIterator +{ + /** @param base base class to collect sub classes for + * @param check_interfaces whether we deal with interfaces + */ + function __construct($base, $check_interfaces = false) + { + foreach(get_declared_classes() as $cname) + { + $parent = get_parent_class($cname); + if (strcasecmp($parent, $base) == 0) + { + $this->offsetSet($cname, new SubClasses($cname)); + } + if ($check_interfaces) + { + if ($parent) + { + $parent_imp = class_implements($parent); + } + foreach(class_implements($cname) as $iname) + { + if (strcasecmp($iname, $base) == 0) + { + if (!$parent || !in_array($iname, $parent_imp)) + { + $this->offsetSet($cname, new SubClasses($cname)); + } + } + } + } + } + if ($check_interfaces) + { + foreach(get_declared_interfaces() as $cname) + { + foreach(class_implements($cname) as $iname) + { + if (strcasecmp($iname, $base) == 0) + { + $this->offsetSet($cname, new SubClasses($cname, true)); + } + } + } + } + $this->uksort('strnatcasecmp'); + } + + /** @return key() since that is the name we need + */ + function current() + { + $result = parent::key(); + $parent = get_parent_class($result); + if ($parent) + { + $interfaces = array_diff(class_implements($result), class_implements($parent)); + if ($interfaces) + { + $implements = array(); + foreach($interfaces as $interface) + { + $implements = array_merge($implements, class_implements($interface)); + } + $interfaces = array_diff($interfaces, $implements); + natcasesort($interfaces); + $result .= ' (' . join(', ', $interfaces) . ')'; + } + } + return $result; + } +} + +$it = new RecursiveTreeIterator(new SubClasses($argv[1], true)); + +echo $argv[1]."\n"; +foreach($it as $c=>$v) +{ + echo "$v\n"; +} + +?>
\ No newline at end of file |