PHP __call()
在对象中调用一个不可访问方法时,__call() 会被调用。
示例
废话不多说,直接上代码。
<?php
namespace App\ThirdPartyRequest;
use Exception;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
/**
* @method wxPayment(array $params)
* @method zfbPayment(array $params)
* @method couponPayment(array $params)
*/
class PayRequest
{
// 接口地址
protected $baseUri = "https://www.xxx.com";
// 请求客户端
protected $client = NULL;
// 可供访问的接口集合
protected $uriMap = [
'wxPayment' => '/v1/wx_payment',
'zfbPayment' => '/v1/zfb_payment',
'couponPayment' => '/v1/coupon_payment',
];
/**
* HTTP Client 发送请求
*
* @param string $uri
* @param array $params
*
* @return array
* @throws Exception|GuzzleException
*/
protected function send(string $uri, array $params): array
{
// 根据使用自己项目中的 HTTP Client,当前以 GuzzleHttp 为例,示例代码如下:
if (is_null($this->client)) {
$this->client = new Client(['base_uri' => $this->baseUri]);
}
$response = $this->client->request('POST', $uri, $params);
if ($response->getStatusCode() == 200) {
$result = $response->getBody()->getContents();
return json_decode($result, TRUE);
}
throw new Exception($response->getBody()->getContents());
}
/**
* 在对象中调用一个不可访问的方法时调用
*
* @param string $method
* @param array $arguments
*
* @return array
* @throws Exception|GuzzleException
*/
public function __call(string $method, array $arguments)
{
$methods = array_keys($this->uriMap);
if (!in_array($method, $methods)) {
throw new Exception('不支持的方法');
}
return $this->send($this->uriMap[$method], ...$arguments);
}
}
调用方式:
(new PayRequest())->wxPayment(['amount' => 1000]);
(new PayRequest())->zfbPayment(['amount' => 1000]);
(new PayRequest())->couponPayment(['amount' => 1000]);
这种写法有个好处,当再增加新接口调用的时候,只需简单配置下即可。
比如,需要新增加银行卡支付
,只需要在 $uriMap
中增加:
'bankCardPayment' => '/v1/bank_card_payment',
最好再增加一行注释,这样便于编辑器代码提示,不增加也不影响代码运行。
* @method bankCardPayment(array $params)
说完了,就到这吧。