当前位置:首页 > PHP

php 实现IOC

2026-01-29 11:48:40PHP

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

控制反转(IoC)是一种设计模式,通过将对象的创建和管理交给外部容器来实现解耦。在 PHP 中,可以通过以下方式实现一个简单的 IoC 容器。

基本容器类实现

创建一个基础的 IoC 容器类,用于注册和解析依赖:

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 singleton($abstract, $concrete = null)
    {
        $this->bind($abstract, $concrete, true);
    }

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

        $binding = $this->bindings[$abstract];
        if ($binding['shared'] && isset($binding['instance'])) {
            return $binding['instance'];
        }

        $instance = $this->build($binding['concrete']);
        if ($binding['shared']) {
            $this->bindings[$abstract]['instance'] = $instance;
        }

        return $instance;
    }

    protected function build($concrete)
    {
        if ($concrete instanceof Closure) {
            return $concrete($this);
        }

        $reflector = new ReflectionClass($concrete);
        if (!$reflector->isInstantiable()) {
            throw new Exception("Target [$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)
    {
        $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].");
                }
            } else {
                $dependencies[] = $this->make($dependency->name);
            }
        }
        return $dependencies;
    }
}

使用示例

定义接口和实现类:

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

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

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

注册依赖并解析:

$container = new Container();

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

// 获取实例
$logger = $container->make(LoggerInterface::class);
$logger->log("Hello World"); // 输出: Logging to file: Hello World

// 单例绑定
$container->singleton(LoggerInterface::class, DatabaseLogger::class);
$logger1 = $container->make(LoggerInterface::class);
$logger2 = $container->make(LoggerInterface::class);
var_dump($logger1 === $logger2); // 输出: bool(true)

自动依赖注入

通过反射自动解析构造函数依赖:

class UserController
{
    protected $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public function action()
    {
        $this->logger->log("User action performed");
    }
}

$controller = $container->make(UserController::class);
$controller->action(); // 输出取决于绑定的 LoggerInterface 实现

闭包绑定

可以使用闭包来定义更复杂的实例化逻辑:

$container->bind('complex.service', function($container) {
    $logger = $container->make(LoggerInterface::class);
    return new ComplexService($logger, 'some_config');
});

实际应用建议

对于生产环境,建议使用成熟的 IoC 容器库如:

  • Laravel 的服务容器
  • PHP-DI
  • Pimple

这些库提供了更完善的功能,包括:

php 实现IOC

  • 自动装配
  • 注解支持
  • 配置管理
  • 生命周期管理

标签: phpIOC
分享给朋友:

相关文章

php实现打印功能

php实现打印功能

PHP 实现打印功能的方法 PHP 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现递归

php实现递归

递归的基本概念 递归是一种函数调用自身的技术,适用于解决可以分解为相同子问题的问题。在PHP中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php 实现下载

php 实现下载

PHP 实现文件下载的方法 使用 PHP 实现文件下载可以通过设置 HTTP 头信息,强制浏览器将文件作为附件下载而非直接打开。 基本下载实现 $file_path = 'path/to/your/…