class_tree.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. <?php
  2. /** @file class_tree.php
  3. * @brief Class Tree example
  4. * @ingroup Examples
  5. * @author Marcus Boerger
  6. * @date 2003 - 2008
  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. $result = parent::key();
  76. $parent = get_parent_class($result);
  77. if ($parent)
  78. {
  79. $interfaces = array_diff(class_implements($result), class_implements($parent));
  80. if ($interfaces)
  81. {
  82. $implements = array();
  83. foreach($interfaces as $interface)
  84. {
  85. $implements = array_merge($implements, class_implements($interface));
  86. }
  87. $interfaces = array_diff($interfaces, $implements);
  88. natcasesort($interfaces);
  89. $result .= ' (' . join(', ', $interfaces) . ')';
  90. }
  91. }
  92. return $result;
  93. }
  94. }
  95. $it = new RecursiveTreeIterator(new SubClasses($argv[1], true));
  96. echo $argv[1]."\n";
  97. foreach($it as $c=>$v)
  98. {
  99. echo "$v\n";
  100. }
  101. ?>