php Throwable和Exceptions树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php Throwable和Exceptions树相关的知识,希望对你有一定的参考价值。

<?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);
        }
    }
}

以上是关于php Throwable和Exceptions树的主要内容,如果未能解决你的问题,请参考以下文章

Exceptions

Exceptions

php7有哪些新特性

PHP 异常与错误 —— Throwable

在scala中正确使用Either,Try和Exceptions / ControlThrowable

如何将 App\Exceptions 从 laravel 7 升级到 laravel 8