我正在查看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
这样的语法。那是什么目的?
答案 0 :(得分:2)
我不是那行代码的原作者所以我只能假设为什么要这样做。
如代码所示,异常的标准消息正在扩展,其中包含字符串处理类的其他信息(getUsed,peek - 听起来像流缓冲区/解析器/ scanner / peeker)。
编辑消息,然后抛出同一类的新对象。
通常:当你在变量中有一个类名并想要创建该类的新实例时,你可以简单地使用:
$className = "ClassName";
$instance = new $className();
这是使用catched exception classname完成的,请参阅get_class
。
进一步注意:这段代码在概念上被破坏了,因为它使用了一个带有未定义接口的类作为它的构造函数。然后它使用构造函数,而不知道它的构造函数。
可能会隐藏一些信息,但不会发生这样的情况。所以这只是一个进一步的说明。你应该有具体的理由去做那样的事情,所以这样做是有原因的,并且可能有一些设计决定没有记录你发布的一些代码行。所以小心处理。