You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

95 lines
1.9 KiB

21 years ago
20 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
  1. <?php
  2. /** @file class_tree.php
  3. * @brief Class Tree example
  4. * @ingroup Examples
  5. * @author Marcus Boerger
  6. * @date 2003 - 2006
  7. * @version 1.1
  8. *
  9. * Usage: php class_tree.php \<class\>
  10. *
  11. * Simply specify the root class or interface to tree with parameter \<class\>.
  12. */
  13. if ($argc < 2) {
  14. echo <<<EOF
  15. Usage: php ${_SERVER['PHP_SELF']} <class>
  16. Displays a graphical tree for the given <class>.
  17. <class> The class or interface for which to generate the tree graph.
  18. EOF;
  19. exit(1);
  20. }
  21. if (!class_exists("RecursiveTreeIterator", false)) require_once("recursivetreeiterator.inc");
  22. /** \brief Collects sub classes for given class or interface
  23. */
  24. class SubClasses extends RecursiveArrayIterator
  25. {
  26. /** @param base base class to collect sub classes for
  27. * @param check_interfaces whether we deal with interfaces
  28. */
  29. function __construct($base, $check_interfaces = false)
  30. {
  31. foreach(get_declared_classes() as $cname)
  32. {
  33. $parent = get_parent_class($cname);
  34. if (strcasecmp($parent, $base) == 0)
  35. {
  36. $this->offsetSet($cname, new SubClasses($cname));
  37. }
  38. if ($check_interfaces)
  39. {
  40. if ($parent)
  41. {
  42. $parent_imp = class_implements($parent);
  43. }
  44. foreach(class_implements($cname) as $iname)
  45. {
  46. if (strcasecmp($iname, $base) == 0)
  47. {
  48. if (!$parent || !in_array($iname, $parent_imp))
  49. {
  50. $this->offsetSet($cname, new SubClasses($cname));
  51. }
  52. }
  53. }
  54. }
  55. }
  56. if ($check_interfaces)
  57. {
  58. foreach(get_declared_interfaces() as $cname)
  59. {
  60. foreach(class_implements($cname) as $iname)
  61. {
  62. if (strcasecmp($iname, $base) == 0)
  63. {
  64. $this->offsetSet($cname, new SubClasses($cname, true));
  65. }
  66. }
  67. }
  68. }
  69. $this->uksort('strnatcasecmp');
  70. }
  71. /** @return key() since that is the name we need
  72. */
  73. function current()
  74. {
  75. return parent::key();
  76. }
  77. }
  78. $it = new RecursiveTreeIterator(new SubClasses($argv[1], true));
  79. echo $argv[1]."\n";
  80. foreach($it as $c=>$v)
  81. {
  82. echo "$v\n";
  83. }
  84. ?>