我正在编写一个REST包装类,它看起来像:
class RestApi
{
public function __call($method, $resource, $data = []){
return $this->call($method, $resource, $data);
}
public function call($http_verb, $resource, $data = []){}
}
但是当我尝试运行以下内容时......
$ra = new RestApi();
$ra->post('api/book/index');
它会抛出以下错误......
RestApi :: __ call()必须正好使用2个参数
我想摆脱重复代码,所以我决定对所有四个http动词使用__call
魔术方法。请建议一个方法。感谢。
答案 0 :(得分:1)
与错误消息一样,__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
错误。