3

我正在查看 Symfony2 类,我发现了类似的东西

try {
            return $this->parseSelectorGroup($stream);
        } catch (\Exception $e) {
            $class = get_class($e);

            throw new $class(sprintf('%s at %s -> %s', $e->getMessage(), implode($stream->getUsed(), ''), $stream->peek()), 0, $e);
        }

他们为什么使用

        $class = get_class($e);

        throw new $class

这样的语法。这样做的目的是什么?

4

1 回答 1

2

我不是那行代码的原作者,所以我只能假设为什么这样做。

如代码所示,异常的标准消息正在使用字符串处理类的附加信息(getUsed,peek - 听起来像流缓冲区/解析器/扫描器/窥视器)进行扩展。

消息被编辑,然后抛出同一类的新对象。

通常:当您在变量中有一个类名并想要创建该类的新实例时,您可以简单地使用:

$className = "ClassName";
$instance = new $className();

这是使用捕获的异常类名在此处完成的,请参阅get_class.

进一步说明:此代码在概念上被破坏,因为它使用了一个具有未定义接口的类作为其构造函数。然后它使用构造函数而不知道它的构造函数。

可能隐藏了一些信息,但这种情况不会发生。所以这只是一个进一步的说明。你应该有具体的理由来做这样的事情,所以这样做是有原因的,可能有一些设计决策没有被你发布的一些代码行记录。所以要小心处理。

于 2012-09-17T18:40:19.063 回答