【问题标题】:catch class based on class name in variable [duplicate]根据变量中的类名捕获类[重复]
【发布时间】:2020-07-07 15:46:58
【问题描述】:

我可以在不知道源代码中的名称的情况下实例化一个类,如下所示:

function get_secret_instance($secret_class_name) {
    return new $secret_class_name();
}

现在,我想扔又接这个。

function throw_and_catch_secret_instance($secret_class_name) {
    try {
        throw new $secret_class_name();
    } catch ($secret_class_name $e) {
        echo "Got you ;)\n";
    }
}

但是,apache 记录了 PHP Parse error: syntax error, unexpected '$secret_class_name' (T_VARIABLE), expecting identifier (T_STRING) or namespace (T_NAMESPACE) or \\\\ (T_NS_SEPARATOR)

我怎样才能做到这一点?

【问题讨论】:

  • 短版:你不能,对不起
  • 为什么不直接使用catch(Exception $e)呢?这将捕获所有异常。
  • @iainn 是的,没找到那个,所以我猜这个可以标记为 dup。
  • @MagnusEriksson 这个想法通常应该是只捕捉需要捕捉的东西。但实际上,这就是我现在正在做的事情,而且看起来,这是唯一有用的方法。 (除了我抓到Throwable 而不是Exception

标签: php


【解决方案1】:

我目前的解决方案/解决方法是使用这个结构:

} catch (Throwable $e) {
    if (strcmp(get_class($e), $secret_class_name)) {
        throw $e;
    }
    echo "Got you ;)\n";
}

【讨论】:

  • $e 将是一个例外,所以我不确定它何时会等于$secret_class_name?或者您是否出于某种原因手动实例化异常?
  • $e 是一个例外,但 get_class($e) 是其类的名称。这就是我在这里比较的东西。
  • 是的,并且该类将是异常(或实现 Throwable 接口的类)。你使用的所有类是否都实现了 Throwable 接口?
  • 是的,因为你不能抛出任何不实现Throwable接口的东西。
  • php.net/manual/en/class.throwable.php: "Throwable 是 PHP 7 中可以通过 throw 语句抛出的任何对象的基本接口,包括错误和异常。"
猜你喜欢
  • 2015-06-22
  • 1970-01-01
  • 2015-09-03
  • 1970-01-01
  • 1970-01-01
  • 2011-09-15
  • 2021-09-05
  • 2014-11-15
  • 2016-10-02
相关资源
最近更新 更多