Created
March 9, 2017 10:58
-
-
Save mlocati/249f07b074a0de339d4d1ca980848e6a to your computer and use it in GitHub Desktop.
Throwable and Exceptions tree
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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); | |
} | |
} | |
} |
Nice functions and well-documented output! Two questions:
- 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"?
- 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
@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. :)
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
Here's the output:
https://3v4l.org/f8Boe