Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony2异常类,为什么使用抛出新的$class?_Php_Symfony - Fatal编程技术网

Php Symfony2异常类,为什么使用抛出新的$class?

Php Symfony2异常类,为什么使用抛出新的$class?,php,symfony,Php,Symfony,我正在查看Symfony2类,我发现了类似的内容 try { return $this->parseSelectorGroup($stream); } catch (\Exception $e) { $class = get_class($e); throw new $class(sprintf('%s at %s -> %s', $e->getMessage(), implode($st

我正在查看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

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

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

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

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

一般情况下:当您在变量中有一个类名,并且希望创建该类的新实例时,您可以简单地使用:

$className = "ClassName";
$instance = new $className();
这里使用捕获的异常类名完成此操作,请参阅

进一步注意:这段代码在概念上是错误的,因为它使用了一个具有未定义接口的类作为其构造函数。然后它使用构造函数,而不知道它的构造函数


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

你也应该从哪个文件和哪一行中添加答案,否则答案可能会非常广泛。
symfony2/vendor/symfony/symfony/src/symfony/Component/CssSelector/CssSelector.php
第99-105Ah行是损坏的CssSelector解析器。这是为了处理通过异常表示的解析错误,因此代码希望保留消息,但使用更多调试信息对其进行扩展。它可能是这样的-但我不知道-一些解析信息通过异常发出信号,这可能是一种气味。解析器停靠在扫描仪的顶部,并动态地执行IIRC。您可以在这里找到另一种CSSSelector解析器:它当前是alpha,但遵循标准,不会中途停止。