当前位置:首页 > PHP

php 实现 ioc

2026-02-14 14:50:33PHP

PHP 实现 IOC(控制反转)容器

控制反转(IoC)是一种设计模式,用于解耦依赖关系。在 PHP 中,可以通过依赖注入(DI)手动实现,或使用容器自动管理依赖。

手动依赖注入实现

通过构造函数或方法参数显式传递依赖对象,实现解耦。

class Database {
    public function query($sql) {
        // 数据库查询逻辑
    }
}

class UserRepository {
    private $db;

    public function __construct(Database $db) {
        $this->db = $db;
    }

    public function getUsers() {
        return $this->db->query('SELECT * FROM users');
    }
}

// 使用
$db = new Database();
$userRepo = new UserRepository($db);

简单 IOC 容器实现

创建一个容器类,用于注册和解析依赖关系。

class Container {
    protected $bindings = [];

    public function bind($abstract, $concrete) {
        $this->bindings[$abstract] = $concrete;
    }

    public function make($abstract) {
        if (isset($this->bindings[$abstract])) {
            $concrete = $this->bindings[$abstract];

            if (is_callable($concrete)) {
                return $concrete($this);
            }

            return new $concrete();
        }

        throw new Exception("No binding found for {$abstract}");
    }
}

// 使用示例
$container = new Container();
$container->bind('Database', function() {
    return new Database();
});

$container->bind('UserRepository', function($container) {
    return new UserRepository($container->make('Database'));
});

$userRepo = $container->make('UserRepository');

自动依赖解析

通过反射自动解析类的依赖关系,无需手动绑定。

class Container {
    public function make($className) {
        $reflector = new ReflectionClass($className);

        if (!$reflector->isInstantiable()) {
            throw new Exception("Class {$className} is not instantiable");
        }

        $constructor = $reflector->getConstructor();

        if (is_null($constructor)) {
            return new $className();
        }

        $parameters = $constructor->getParameters();
        $dependencies = [];

        foreach ($parameters as $parameter) {
            $dependency = $parameter->getClass();

            if (is_null($dependency)) {
                if ($parameter->isDefaultValueAvailable()) {
                    $dependencies[] = $parameter->getDefaultValue();
                } else {
                    throw new Exception("Cannot resolve class dependency {$parameter->name}");
                }
            } else {
                $dependencies[] = $this->make($dependency->name);
            }
        }

        return $reflector->newInstanceArgs($dependencies);
    }
}

// 使用
$container = new Container();
$userRepo = $container->make('UserRepository');

使用现有 IOC 容器库

PHP 生态系统中有多个成熟的 IOC 容器实现:

  1. PHP-DI: 功能丰富的依赖注入容器

    use DI\ContainerBuilder;
    
    $builder = new ContainerBuilder();
    $builder->addDefinitions([
        'Database' => function() {
            return new Database();
        }
    ]);
    $container = $builder->build();
  2. Laravel 容器: Laravel 框架的 IOC 容器也可独立使用

    $container = new Illuminate\Container\Container();
    $container->bind('Database', function() {
        return new Database();
    });

最佳实践建议

  • 优先考虑使用构造函数注入,它使依赖关系更明确
  • 对于简单项目,手动依赖注入可能足够
  • 复杂项目建议使用成熟的容器库如 PHP-DI
  • 避免服务定位器模式(直接从容器的全局实例获取依赖),这会使代码更难测试

通过以上方法可以在 PHP 项目中实现控制反转,提高代码的可测试性和可维护性。

php 实现 ioc

标签: phpioc
分享给朋友:

相关文章

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_sh…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $n…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $d…

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。用…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…