一个简单的「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 协议》,转载必须注明作者和本文链接
悲观者永远正确,乐观者永远前行。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5
陈先生

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

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

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

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

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

1年前 评论

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