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 に答える