Skip to content

Instantly share code, notes, and snippets.

@lamngockhuong
Last active July 7, 2018 06:49
Show Gist options
  • Save lamngockhuong/c58140d1cc0172cf4820c3f056c752f2 to your computer and use it in GitHub Desktop.
Save lamngockhuong/c58140d1cc0172cf4820c3f056c752f2 to your computer and use it in GitHub Desktop.
Throwable and Exceptions tree
<?php
if (!function_exists('interface_exists')) {
die('PHP version too old');
}
$throwables = listThrowableClasses();
$throwablesPerParent = splitInParents($throwables);
printTree($throwablesPerParent);
if (count($throwablesPerParent) !== 0) {
die('ERROR!!!');
}
function listThrowableClasses()
{
$result = [];
if (interface_exists('Throwable')) {
foreach(get_declared_classes() as $cn) {
$implements = class_implements($cn);
if (isset($implements['Throwable'])) {
$result[] = $cn;
}
}
}
else {
foreach(get_declared_classes() as $cn) {
if ($cn === 'Exception' || is_subclass_of($cn, 'Exception')) {
$result[] = $cn;
}
}
}
return $result;
}
function splitInParents($classes)
{
$result = [];
foreach($classes as $cn) {
$parent = (string)get_parent_class($cn);
if (isset($result[$parent])) {
$result[$parent][] = $cn;
}
else {
$result[$parent] = [$cn];
}
}
return $result;
}
function printTree(&$tree)
{
if (!isset($tree[''])) {
die('No root classes!!!');
}
printLeaves($tree, '', 0);
}
function printLeaves(&$tree, $parent, $level)
{
if (isset($tree[$parent])) {
$leaves = $tree[$parent];
unset($tree[$parent]);
natcasesort($leaves);
$leaves = array_values($leaves);
$count = count($leaves);
for ($i = 0; $i < $count; ++$i) {
$leaf = $leaves[$i];
echo str_repeat(' ', $level) , $leaf, "\n";
printLeaves($tree, $leaf, $level + 1);
}
}
}
@lamngockhuong
Copy link
Author

Here's the output: https://3v4l.org/7fLUP

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment