一个简单的「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 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 5

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

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

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

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

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

1年前 评论

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