Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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);
}
}
}
@mlocati

This comment has been minimized.

Copy link
Owner Author

commented Mar 9, 2017

Here's the output:

https://3v4l.org/f8Boe

@schmidtl4

This comment has been minimized.

Copy link

commented Aug 28, 2018

Nice functions and well-documented output! Two questions:

  1. I'm just diving into the world of custom error_handling. Are these functions in place of set_error_handler()? or are they themselves the "error_handler"?
  2. how is your code called/referenced in code? is your function called as part of the catch of a try-catch block or some other method?
    Thanks,
    Les
@d4rkne55

This comment has been minimized.

Copy link

commented Oct 31, 2018

@schmidtl4 It's not an error handler and isn't getting registered as such in this code, it's just a helpful output for development, to see the available Exceptions. :)

@PCouaillier

This comment has been minimized.

Copy link

commented Apr 26, 2019

Small update to support HHVM 3.20-3.22 (if Throwable exists but no exceptions implements it.)

https://3v4l.org/VG4TN

|Edit add 3v4l link]

<?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 = [];
    $throwableExists = interface_exists('Throwable');
    if ($throwableExists) {
        foreach (get_declared_classes() as $cn) {
            $implements = class_implements($cn);
            if (isset($implements['Throwable'])) {
                $result[] = $cn;
            }
        }
    }
    if (!$throwableExists || empty($result)) {
        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);
        }
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.