当链中的最后一个方法需要先调用其他方法时抛出哪个 PHP 异常

Which PHP exception to throw when last method in chain requires other method called first

我正在编写一个 PHP 查询生成器样式的库,它使用方法链向查询添加约束,最后调用 get() 来执行请求,类似于 Laravel 的查询构建器,但通过 Guzzle 使用 public JSON API 获取数据。例如:

// valid
Foo::queryType()->take(5)->skip(50)->get();

// invalid, missing query type
Foo::take->(5)->get();

Foo 只是访问图书馆的门面。 queryType() 是必需的初始方法(可以是许多方法之一,例如 queryTypeA()queryTypeB()),它在 Foo 中设置受保护的 class 变量。如果在没有先设置该变量的情况下调用 get(),我想抛出一个 Exception。我想准确说明抛出的内容。

PHP的documentation列出了几个选项:

可能不是指缺少先决条件,我感觉这更适用于该方法不存在的动态调用。

与以前基本相同,但用于一般 函数 ,并且 BadMethodCallException 实际上是此 class 的子项。

虽然在技术上不是 参数 ,但继续执行所需的未设置保护 class 变量符合一般想法,因此到目前为止这个最有意义。

不是真正的选择;虽然这个名字暗示我可能想要与此相反的东西——我 期望 设置一个值但它不存在 - 描述似乎不像其他人那样匹配,并且没有用户贡献帮助完善的注释。

我的后备。也许我想得太多了?哪个 PHP 异常最有意义?

根据我的库的设计,我最终选择了 BadMethodCallException。由于外部 class 只是一个外观,我使用 __call 魔术方法将任何未定义的方法调用传递给内部 class 变量。

通过调用后,内部 class 变量被设置为 null 以便从字面上取消定义方法调用。但是,为了区分未定义的方法和乱序链接,我明确检查 class 变量是否为 null 并提供具体错误。

protected $request = null;

/**
 * Pass through non-explicitly defined method calls to the internal request class
 * @param  string $function
 * @param  array $args
 * @return mixed
 * @throws \BadMethodCallException
 */
public function __call($function, $args)
{
    if ($this->request === null) {
        throw new \BadMethodCallException('Must specify request type before chaining constraints.');
    }

    if (method_exists($this->request, $function)) {
        $result = $this->request->$function(sizeof($args) ? $args[0] : null);

        $this->request = null;

        return $result;
    }

    throw new \BadMethodCallException('Method \'' . $function . '()\' does not exist.');
}