就像错误消息所暗示的那样,__call 魔术方法只接受 2 个参数:请求的方法的名称,以及传递的参数的数组。所有这些信息都可以在here找到。
考虑到这一点,也许修改你的代码看起来更像这样:
public function __call($method, $arguments) {
return $this->call($method, $arguments[0], $arguments[1]);
}
假设您使用 CURL 实现实际的 API 请求(这可能是一个非常大的假设),您可以在您的 call() 方法中执行类似的操作:
switch (strtoupper($http_verb)) {
case 'GET':
// Nothing special happens here, this is CURL's default behavior
break;
case 'POST':
curl_setopt($ch, CURLOPT_POST, true);
break;
case 'PUT':
curl_setopt($ch, CURLOPT_PUT, true);
break;
// Etc...
}
这纯粹是一个示例,用于演示您可以使用 __call() 魔术方法执行的条件逻辑。有许多 libraries and frameworks 创建 REST 包装器,就像您正在尝试做的那样。我建议将其中的一个视为一种学习体验,或者调查像 Guzzle 这样的库。
注意:当然,如果有一个可选的第二个参数(就像你上面所说的那样),在盲目地传递它们之前做一些检查以查看 $arguments[1] 等是否存在是明智的。否则你会得到类似PHP Notice: Undefined offset: 1的东西。
更新
关于我的最后一段,@JayTaph 有一个很好的建议。一种简洁的方法(一行,无需额外检查)是使用以下内容:
public function __call($method, $arguments) {
return this->call($method, array_shift($arguments), $arguments);
}
如果只传递一个参数,在第一个元素被array_shift() 移出后,$arguments 将是一个空数组,这避免了我上面提到的PHP Notice: Undefined offset 错误。