控制反转?
今年准备毕业,到公司实习,接手了一些代码,但存在一些疑惑,同事也不是很了解。
主要问题是这样的,公司做游戏,游戏平台需要使用多个sdk。
比如说登录:
统一接口
$sdkManager = SdkManager::resolve();
$resp = $sdkManager->login();
SdkManager 使用服务提供者注册了门面
$this->app->singleton('sdk_manager', function () {
return new SdkManager();
});
class SdkManager
{
protected $managers = [];
/**
* @param null $sdk_type
* @param $data
* @return mixed
* @throws Exceptions
*/
public function resolve($sdk_type = null){
$sdk_type = $sdk_type ?: request('sdk_type');
if (isset($this->managers[$sdk_type])) {
return new $this->managers[$sdk_type];
}
throw new Exceptions(Exceptions::SDK_MANAGER_NOT_FOUND);
}
}
根据request中的参数去实例化不同的SDK实现类(这些类也都实现了SDK的契约)
namespace App\Contracts;
interface SdkManage
{
public function login();
public function pay();
public function generateSign(array $data = [], $orderId = null, $os = null);
}
因为一些隐私问题,实现类都有对应的key(有点奇怪,不写在env里)
我想咨询一些
- 这算不算是一种控制反转?
SdkManager
中managers不应该是空数组吗,按道理不应该是抛出异常吗?为什么会进入到if里,实例化SDK
回答一:这算是一种反转控制
回答二: 这里需要你断点调试或者打印数组