Skip to content

Instantly share code, notes, and snippets.

@JingwenTian
Forked from mlocati/exceptions-tree.php
Created September 26, 2018 20:22
Show Gist options
  • Save JingwenTian/64174fd747d435d6549d9c31565bb67b to your computer and use it in GitHub Desktop.
Save JingwenTian/64174fd747d435d6549d9c31565bb67b to your computer and use it in GitHub Desktop.

Revisions

  1. @mlocati mlocati created this gist Mar 9, 2017.
    70 changes: 70 additions & 0 deletions exceptions-tree.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,70 @@
    <?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);
    }
    }
    }