当前位置:首页 > PHP

php ioc 实现

2026-02-13 20:04:02PHP

PHP IOC 实现方法

依赖注入容器(DIC)基础实现
创建一个简单的容器类,用于存储和解析依赖关系。通过绑定接口与实现类,容器自动解析依赖链。

class Container {
    protected $bindings = [];

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

    public function make($abstract) {
        if (!isset($this->bindings[$abstract])) {
            throw new Exception("No binding found for {$abstract}");
        }
        $concrete = $this->bindings[$abstract];
        return is_callable($concrete) ? $concrete($this) : $this->build($concrete);
    }

    protected function build($concrete) {
        $reflector = new ReflectionClass($concrete);
        if (!$reflector->isInstantiable()) {
            throw new Exception("{$concrete} is not instantiable");
        }
        $constructor = $reflector->getConstructor();
        if (is_null($constructor)) {
            return new $concrete();
        }
        $dependencies = $this->resolveDependencies($constructor->getParameters());
        return $reflector->newInstanceArgs($dependencies);
    }

    protected function resolveDependencies($parameters) {
        return array_map(function($param) {
            return $this->make($param->getClass()->name);
        }, $parameters);
    }
}

使用反射自动解析
通过PHP的ReflectionClass分析类的构造函数参数,递归实例化所有依赖对象。此方法无需手动绑定具体实现,但要求依赖关系明确可推断。

$container = new Container();
$service = $container->make(Service::class); // 自动解析Service及其所有依赖

接口绑定实现
将接口绑定到具体实现类,实现松耦合。修改实现类时只需调整绑定关系,不影响上层代码。

$container->bind(LoggerInterface::class, FileLogger::class);
$logger = $container->make(LoggerInterface::class); // 返回FileLogger实例

闭包工厂绑定
对于需要复杂初始化的对象,使用闭包延迟创建过程。闭包接收容器实例以便解析嵌套依赖。

$container->bind(Database::class, function($container) {
    $config = $container->make(Config::class);
    return new Database($config->get('db_uri'));
});

PSR-11兼容容器
实现Psr\Container\ContainerInterface接口,确保与其他遵循PSR标准的库兼容。需实现get()has()方法。

class PsrContainer extends Container implements \Psr\Container\ContainerInterface {
    public function get($id) {
        return $this->make($id);
    }
    public function has($id) {
        return isset($this->bindings[$id]);
    }
}

实际应用示例
在MVC框架中集中管理控制器依赖,避免在控制器内部手动实例化服务。

$container->bind(UserController::class, function($container) {
    return new UserController(
        $container->make(UserRepository::class),
        $container->make(Mailer::class)
    );
});
$controller = $container->make(UserController::class);

性能优化建议
对已解析的依赖进行缓存,避免重复反射开销。可通过在容器内添加$instances数组存储单例对象实现。

php ioc 实现

protected $instances = [];

public function singleton($abstract, $concrete) {
    $this->bind($abstract, function($container) use ($concrete) {
        if (!isset($this->instances[$abstract])) {
            $this->instances[$abstract] = $container->build($concrete);
        }
        return $this->instances[$abstract];
    });
}

标签: phpioc
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP实现打印功能的方法 在PHP中实现打印功能可以通过多种方式完成,包括直接输出到浏览器、生成PDF文件、调用打印机接口等。以下是几种常见的方法: 直接输出HTML内容 PHP可以通过echo或p…

php实现增删改查

php实现增删改查

以下是在PHP中实现增删改查(CRUD)操作的详细方法,以MySQL数据库为例: 数据库连接配置 创建config.php文件存储数据库连接信息: <?php $host = 'localh…

php实现接口

php实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不实现具体功能。类可以实现一个或多个接口,并必须实现接口中定义的所有方法。 定义接口 接口使用 inter…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节点。每个…

php 实现mvc

php 实现mvc

PHP 实现 MVC 架构的方法 MVC(Model-View-Controller)是一种常见的软件设计模式,用于分离业务逻辑、用户界面和用户输入。以下是 PHP 实现 MVC 架构的关键步骤:…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…