一个简单的「IOC」例子

控制反转(Inversion of Control,缩写IoC)是一种的对象设计模式,它把对象的创建和使用分开,通过容器来管理对象之间的依赖关系。在PHP中可以使用现成的容器类库或手动编写容器来实现IoC。以下是一个使用手动编写容器的例子:

// 定义某个类,它需要依赖于其他类
class SomeClass {
    public function __construct(SomeDependency $dep) {
        $this->dep = $dep;
    }
    public function doSomething() {
        echo $this->dep->getValue();
    }
}

// 定义另外一个类,它是SomeClass的依赖
class SomeDependency {
    public function getValue() {
        return "Hello, I am dependency!";
    }
}

// 手动编写容器,并将SomeDependency类的实例注册到容器中
$container = [];
$container['SomeDependency'] = function(){
    return new SomeDependency();
};

// 从容器中获取SomeClass的实例并使用  
$container['SomeClass'] = function($container){
    return new SomeClass($container['SomeDependency']());
};
$someClass = $container['SomeClass']($container);

// 输出: Hello, I am dependency!
$someClass->doSomething();

在这个例子中,SomeClass 类需要依赖于 SomeDependency 类,因此在其构造函数中接受了一个 SomeDependency 类的实例,并调用其 getValue() 方法。

接下来我们手动编写了一个容器 $container,并将 SomeDependency 类作为其中的一个服务进行注册。在注册 SomeClass 类时,我们利用了 PHP 的闭包函数来将 SomeDependency 类的实例注入 SomeClass 类构造函数中,实现了控制反转。

最后,我们可以通过从容器中获取 SomeClass 类的实例并调用其 doSomething() 方法,来使用我们手动编写的IoC容器。

本作品采用《CC 协议》,转载必须注明作者和本文链接
悲观者永远正确,乐观者永远前行。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

你写的太高深了,我看不懂,你能整点我可以看懂的代码么?佬! 如果可以的话,我保佑你外卖永不超时!

2年前 评论
MArtian (楼主) 2年前
// 从容器中获取SomeClass的实例并使用  
$container['SomeClass'] = function($container){
    return new SomeClass($container['SomeDependency']);
};

$container['SomeDependency'] 是一个匿名函数,SomeClass 构造函数依赖的是 SomeDependency 实例,这一步代码会报错

2年前 评论
MArtian (楼主) 2年前

代码能看懂~就是搞不清楚哪里反转了~

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!