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); | |
} | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
Nice functions and well-documented output! Two questions:
|
This comment has been minimized.
This comment has been minimized.
@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. :) |
This comment has been minimized.
This comment has been minimized.
Small update to support HHVM 3.20-3.22 (if Throwable exists but no exceptions implements it.) |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
This comment has been minimized.
Here's the output:
https://3v4l.org/f8Boe