如何理解 Laravel 的 Ioc 容器

 我来答
lilipat
高粉答主

2017-04-03 · 每个回答都超有意思的
知道大有可为答主
回答量:3万
采纳率:94%
帮助的人:4988万
展开全部
laravel -IOC容器
分类:laravel

1、laravel的核心–IOC容器–“服务容器”
1)IOC–控制反转
a.工厂模式–一个类所依赖的外部事物的实例
工厂模式示例:谈亏
工厂类:
class SuperModuleFactory
{
public function makeModule($moduleName, $options)
{
switch ($moduleName) {
case 'Fight': return new Fight($options[0], $options[1]);
case 'Force': return new Force($options[0]);
case 'Shot': return new Shot($options[0], $options[1], $options[2]);
}
}
}1234567891011

使用工厂类:
class Superman
{
protected $power;

public function __construct(array $modules)
{
// 初始化工厂
$factory = new SuperModuleFactory;

// 通过工厂提供的方法制含禅神造需要的模块
foreach ($modules as $moduleName => $moduleOptions) {
$this->power[] = $factory->makeModule($moduleName, $moduleOptions);
}
}
}

// 创建超人
$superman = new Superman([
'Fight' => [9, 100],
'Shot' => [99, 50, 2]
]);123456789101112131415161718192021

2)DI – 依赖注入
只要不是由内部生产(比如初始化、构造函数 __construct 中通过工厂方法、自行手动 new 的),而是由外部以参数或其袭昌他形式注入的,都属于 依赖注入(DI)
示例:
模组类:
/**
* X-超能量
*/
class XPower implements SuperModuleInterface
{
public function activate(array $target)
{
// 这只是个例子。。具体自行脑补
}
}

/**
* 终极炸弹 (就这么俗)
*/
class UltraBomb implements SuperModuleInterface
{
public function activate(array $target)
{
// 这只是个例子。。具体自行脑补
}
}123456789101112131415161718192021

类初始化话改造:
class Superman
{
protected $module;

public function __construct(SuperModuleInterface $module)
{
$this->module = $module
}
}

// 超能力模组
$superModule = new XPower;

// 初始化一个超人,并注入一个超能力模组依赖
$superMan = new Superman($superModule);123456789101112131415

3)IOC容器–工厂模式升华
创建容器
class Container
{
protected $binds;

protected $instances;

public function bind($abstract, $concrete)
{
if ($concrete instanceof Closure) {
$this->binds[$abstract] = $concrete;
} else {
$this->instances[$abstract] = $concrete;
}
}

public function make($abstract, $parameters = [])
{
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}

array_unshift($parameters, $this);

return call_user_func_array($this->binds[$abstract], $parameters);
}
}1234567891011121314151617181920212223242526

使用容器
// 创建一个容器(后面称作超级工厂)
$container = new Container;

// 向该 超级工厂 添加 超人 的生产脚本
$container->bind('superman', function($container, $moduleName) {
return new Superman($container->make($moduleName));
});

// 向该 超级工厂 添加 超能力模组 的生产脚本
$container->bind('xpower', function($container) {
return new XPower;
});

// 同上
$container->bind('ultrabomb', function($container) {
return new UltraBomb;
});

// ****************** 华丽丽的分割线 **********************
// 开始启动生产
$superman_1 = $container->make('superman', ['xpower']);
$superman_2 = $container->make('superman', ['ultrabomb']);
$superman_3 = $container->make('superman', ['xpower']);
// ...随意添加123456789101112131415161718192021222324

参考文档:
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式