PHP 中的 Fluent Interface 方法能否检测到它在链中的位置?

Can a Fluent Interface method in PHP detect where it is in the chain?

我正在考虑创建一个使用方法链的 class。我想要实现的是方法输出的类型,基于方法是否链接。

示例 1:

$var = $instance->user($id);

Returns 包含必要信息的数组。

示例 2:

$var = $instance->user($id)->action($arg);

我希望 user() 前面的链接方法只将参数 $id 传递给下一个方法,而不输出任何内容。然后方法 action() 获取 $id 和 return 所问的内容。

我怎样才能做到这一点?

我不想让 user() return 成为其正常结果代码的原因是因为我打算在 API 包装器中使用它。返回“正常”user() 将花费我一个额外的 X-Rate-Limit 电话。如果我可以节省这个调用,只将参数 $id 传递给第二个方法,那将是理想的。

user() 应该 return 用户对象,而不是 return 数组。

这样,$var = $instance->user($id); 将 return 您需要的信息(因为所有信息都将在 User 对象中)并且 $var = $instance->user($id)->action($arg); 将调用 User 对象上的 action() (这样就可以方便的获取到用户的id)

不再需要区分 user() 的调用方式。 ;)

您当前的计划是让您的每个方法都执行一次昂贵的 HTTP 调用,但您知道如果链接多个方法可能会出现显着的延迟。

一个好的解决方案是使用链式方法设置参数,然后 运行 最后一个执行方法。因此,您可以这样修改示例:

$var = $instance->user($id)->execute();
$var = $instance->user($id)->action($arg)->execute();

您将有 user()action() returning $this(以及以某种方式更改实例的状态)然后 execute()将 运行 一次性调用 HTTP。这使得最后一个之前的所有调用确实非常便宜。

return 值 可能 $this,尽管这种终止方法可能只是 return 布尔成功值。您的示例暗示一个值是预期的 - 与 execute() 之前的最后一个方法相关的值也可能有效。