当前位置:首页 > 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实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现递归

php实现递归

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

php 实现自动收货

php 实现自动收货

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

php实现队列

php实现队列

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

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php如何实现直播

php如何实现直播

实现直播功能的方法 PHP可以通过结合其他技术和工具来实现直播功能。以下是几种常见的方法: 使用流媒体服务器 配置流媒体服务器如Nginx-RTMP、Red5或Wowza。这些服务器支持RTM…