PHP之依赖注入(Dependency Injection,简称DI)

一、什么叫依赖?

假设有一个订单类 Order 和一个库存类 Inventory。订单类需要库存类来检查商品的库存状态并更新库存。在这种情况下,订单类就依赖于库存类。订单类会调用库存类的方法来完成特定的库存检查和更新操作

<?php
// 定义库存类
class Inventory {
    public function checkStock($productId) {
        // 检查库存逻辑
        // ...
        return true;
    }

}
// 定义订单类
class Order {
    public function placeOrder($productId) {
        // 创建库存对象
         $inventory = new Inventory();
        if ($inventory->checkStock($productId)) {
            echo "可以下单";
        } else {
            echo "库存不足,无法下单!";
        }
    }
}


$order = new Order();
// 调用订单方法下单
$order->placeOrder(123456);
二、什么叫注入? 

注入(Injection)是指将一个对象的依赖关系通过外部方式传递给该对象的过程。注入可以分为构造函数注入(Constructor Injection)、属性注入(Property Injection)和方法注入(Method Injection)三种形式。

// 定义订单类
class Order {
    private $inventory;

    public function __construct(Inventory $inventory) {
        $this->inventory = $inventory;
    }

    public function placeOrder($productId) {
        if ($this->inventory->checkStock($productId)) {
            $this->inventory->updateStock($productId);
            echo "订单已成功下单!";
        } else {
            echo "库存不足,无法下单!";
        }
    }
}
// 创建库存对象
$inventory = new Inventory();
// 创建订单对象并注入库存对象
$order = new Order($inventory);
// 调用订单方法下单
$order->placeOrder(123456);
三、什么叫 依赖注入?

 依赖注入是指将一个对象的依赖关系从该对象自身移动到另一个地方,并由外部容器来管理和注入这些依赖。即,对象不再负责创建或查找依赖关系,而是通过构造函数、方法参数或者属性注入的方式接收依赖。这样做的好处是,使得对象更加独立、可复用和易于测试,因为它们只需关注自身的职责,而不用关心如何创建或管理依赖。

<?php
// 定义库存类
class Inventory {
    public function checkStock($productId) {
        // 检查库存逻辑
        // ...
        return true;
    }

}
// 定义订单类
class Order {
    private $inventory;

    public function __construct(Inventory $inventory) {
        $this->inventory = $inventory;
    }

    public function placeOrder($productId) {
        if ($this->inventory->checkStock($productId)) {
            $this->inventory->updateStock($productId);
            echo "订单已成功下单!";
        } else {
            echo "库存不足,无法下单!";
        }
    }
}
// 创建库存对象
$inventory = new Inventory();
// 创建订单对象并注入库存对象
$order = new Order($inventory);
// 调用订单方法下单
$order->placeOrder(123456);

猜你喜欢

转载自blog.csdn.net/weixin_39934453/article/details/131962022