Php 在try-catch块中使用get_类

Php 在try-catch块中使用get_类,php,class,exception,Php,Class,Exception,问题 是否可以在PHP中用get\u class方法实例化一个类 是否可以使用get_class进入catch()块来捕获该类型错误的异常 我自己的尝试 $class = get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!')); try { //Some code } catch($class $e)) { //Do stuff with the exception } 无论

问题

  • 是否可以在PHP中用
    get\u class
    方法实例化一个类
  • 是否可以使用
    get_class
    进入
    catch()
    块来捕获该类型错误的异常
我自己的尝试

$class = get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!'));

try {
   //Some code

} catch($class $e)) {
   //Do stuff with the exception
}
无论何时使用
get\u类
,它都会以字符串形式返回类名。当我尝试像这样实例化它时:

$classWhereExceptionObjectIsStored = new classWhereExceptionObjectIsStored();

try {
   //Some code

} catch(get_class($classWhereExceptionObjectIsStored->getExceptionObject $e)) {
   //Do stuff with the exception
}
它不起作用

班级:

class classWhereExceptionObjectIsStored
{

    public function getExceptionObject($message) {
        return new LogicException($message); //For example
    }
}
第二次尝试

$class = get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!'));

try {
   //Some code

} catch($class $e)) {
   //Do stuff with the exception
}
只返回类的名称,这就是该函数的用法。可以通过执行以下操作动态实例化类:

new $class();
在您的情况下,可能会导致以下情况:

new get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!'));
这在抓块中不起作用。这是因为您没有实例化catch块中的任何内容—您在其中指定的唯一内容是您期望得到的异常类

另一种方法是捕获所有异常:

catch(Exception $e){}
然后在该捕获中,使用PHP函数检查抛出的异常是否属于您期望的类型,如下所示:

if(is_a($e, get_class($classWhereExceptionObjectIsStored->getExceptionInstance('hi!'))){}

然而,我真的怀疑你的动机。我想不出任何用例会增加功能性、可读性、可伸缩性或可用性。

我只是环顾了一些函数,想出了一个想法:)但是我该如何在
catch()
块中使用它呢?因为你没有在那里呼叫
新的
操作员。没有。(评论太短,无法发布)但如果我只捕获了
捕获(例外$e)
,那会有那么糟糕吗?我猜是一样的?这实际上取决于您的目的,使用该子句捕获所有异常是否不好。我很难理解你的确切情况;通常知道将抛出哪些异常(类型)。你可以按照正确的层次顺序捕捉它们,对吗?如果您将要收到的异常总是一个惊喜,则说明您的设计有问题。不,我正确地维护了我的异常,并且我知道要接收哪个异常。它们都是
异常
对象的“子对象”