当前位置:首页 > PHP

php 实现 ioc

2026-01-29 16:50:12PHP

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

IOC(Inversion of Control)是一种设计模式,通过将对象的创建和管理交给容器来实现解耦。在 PHP 中,可以通过依赖注入(DI)和容器类来实现 IOC。

实现一个简单的 IOC 容器

以下是一个基础的 IOC 容器实现,支持绑定和解析依赖:

<?php
class Container {
    protected $bindings = [];

    // 绑定接口或抽象类到具体实现
    public function bind($abstract, $concrete = null, $shared = false) {
        if (is_null($concrete)) {
            $concrete = $abstract;
        }
        $this->bindings[$abstract] = compact('concrete', 'shared');
    }

    // 解析实例
    public function make($abstract) {
        if (!isset($this->bindings[$abstract])) {
            return $this->build($abstract);
        }

        $concrete = $this->bindings[$abstract]['concrete'];
        $shared = $this->bindings[$abstract]['shared'];

        if ($shared && isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }

        $object = $this->build($concrete);

        if ($shared) {
            $this->instances[$abstract] = $object;
        }

        return $object;
    }

    // 构建实例
    protected function build($concrete) {
        $reflector = new ReflectionClass($concrete);
        if (!$reflector->isInstantiable()) {
            throw new Exception("Class {$concrete} is not instantiable");
        }

        $constructor = $reflector->getConstructor();
        if (is_null($constructor)) {
            return new $concrete();
        }

        $dependencies = $constructor->getParameters();
        $instances = $this->resolveDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }

    // 解析依赖
    protected function resolveDependencies($parameters) {
        $dependencies = [];
        foreach ($parameters as $parameter) {
            $dependency = $parameter->getClass();
            if (is_null($dependency)) {
                if ($parameter->isDefaultValueAvailable()) {
                    $dependencies[] = $parameter->getDefaultValue();
                } else {
                    throw new Exception("Cannot resolve dependency {$parameter->name}");
                }
            } else {
                $dependencies[] = $this->make($dependency->name);
            }
        }
        return $dependencies;
    }
}

使用示例

定义一个接口和实现类:

php 实现 ioc

interface LoggerInterface {
    public function log($message);
}

class FileLogger implements LoggerInterface {
    public function log($message) {
        echo "Log to file: {$message}\n";
    }
}

class DatabaseLogger implements LoggerInterface {
    public function log($message) {
        echo "Log to database: {$message}\n";
    }
}

绑定并解析依赖:

$container = new Container();

// 绑定接口到具体实现
$container->bind(LoggerInterface::class, FileLogger::class);

// 解析实例
$logger = $container->make(LoggerInterface::class);
$logger->log("Hello IOC Container");

使用第三方库

对于更成熟的 IOC 容器实现,可以使用以下流行的 PHP 库:

php 实现 ioc

  • Laravel 的 IOC 容器:Laravel 框架内置了强大的 IOC 容器,可以直接使用或独立集成。
  • PHP-DI:一个专为 PHP 设计的依赖注入容器,支持自动装配和注解。
  • Pimple:一个轻量级的依赖注入容器,适合小型项目。

使用 PHP-DI 实现 IOC

安装 PHP-DI:

composer require php-di/php-di

示例代码:

<?php
require 'vendor/autoload.php';

use DI\Container;
use DI\ContainerBuilder;

$builder = new ContainerBuilder();
$builder->addDefinitions([
    LoggerInterface::class => DI\create(FileLogger::class)
]);
$container = $builder->build();

$logger = $container->get(LoggerInterface::class);
$logger->log("Hello PHP-DI");

总结

实现 IOC 容器的核心是通过反射解析依赖并自动注入。自定义容器适合学习原理,而生产环境推荐使用成熟的库如 PHP-DI 或 Laravel 容器。

标签: phpioc
分享给朋友:

相关文章

php实现购物车

php实现购物车

PHP实现购物车功能 购物车功能是电商网站的核心模块之一,通常涉及商品添加、删除、数量修改和结算等操作。以下是使用PHP实现购物车功能的几种方法。 使用Session存储购物车数据 Session是…

php实现增删改查

php实现增删改查

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

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php实现登录

php实现登录

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

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…