当前位置:首页 > PHP

php 实现 ioc

2026-02-28 14:05:00PHP

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

控制反转(IoC)是一种设计模式,用于解耦组件依赖关系。在 PHP 中,可以通过依赖注入(DI)或服务容器实现 IoC。以下是具体实现方法:

基础 IoC 容器实现

创建一个简单的 IoC 容器类,用于管理依赖关系:

class Container {
    protected $instances = [];

    public function bind($abstract, $concrete = null) {
        if (is_null($concrete)) {
            $concrete = $abstract;
        }
        $this->instances[$abstract] = $concrete;
    }

    public function make($abstract, $parameters = []) {
        if (!isset($this->instances[$abstract])) {
            $this->bind($abstract);
        }

        return $this->resolve($this->instances[$abstract], $parameters);
    }

    protected function resolve($concrete, $parameters) {
        if ($concrete instanceof Closure) {
            return $concrete($this, $parameters);
        }

        $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 = $this->resolveDependencies(
            $constructor->getParameters(),
            $parameters
        );

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

    protected function resolveDependencies($parameters, $customParameters) {
        $dependencies = [];
        foreach ($parameters as $parameter) {
            if (array_key_exists($parameter->name, $customParameters)) {
                $dependencies[] = $customParameters[$parameter->name];
            } else {
                $dependencies[] = $this->make($parameter->getClass()->name);
            }
        }
        return $dependencies;
    }
}

使用示例

定义接口和实现类:

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

class FileLogger implements LoggerInterface {
    public function log($message) {
        file_put_contents('app.log', $message, FILE_APPEND);
    }
}

class UserController {
    protected $logger;

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

    public function register($user) {
        $this->logger->log("User registered: {$user}");
    }
}

配置和使用容器:

php 实现 ioc

$container = new Container();
$container->bind(LoggerInterface::class, FileLogger::class);

$controller = $container->make(UserController::class);
$controller->register('John Doe');

高级功能实现

实现单例绑定:

public function singleton($abstract, $concrete = null) {
    $this->bind($abstract, function($container) use ($concrete) {
        static $instance;
        if (is_null($instance)) {
            $instance = $container->make($concrete);
        }
        return $instance;
    });
}

实现接口绑定:

public function bindInterface($interface, $implementation) {
    $this->bind($interface, $implementation);
}

自动依赖解析

通过反射自动解析未绑定的依赖:

php 实现 ioc

protected function resolveUnboundDependency(ReflectionParameter $parameter) {
    if ($parameter->getClass()) {
        return $this->make($parameter->getClass()->name);
    }
    throw new Exception("Cannot resolve dependency {$parameter->name}");
}

实际应用建议

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

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

这些库提供了更完善的特性,如:

  • 自动装配
  • 注解支持
  • 配置管理
  • 性能优化

性能考虑

实现 IoC 容器时需注意:

  • 反射操作有性能开销,可缓存解析结果
  • 避免深层嵌套依赖
  • 对高频使用的服务使用单例绑定

以上实现展示了 PHP 中 IoC 容器的核心原理,可根据项目需求进行扩展或选择现有解决方案。

标签: phpioc
分享给朋友:

相关文章

php实现异步

php实现异步

PHP 实现异步的方法 PHP 本身是同步执行的脚本语言,但可以通过以下方法模拟异步操作或实现异步效果: 使用多进程(pcntl_fork) 通过 pcntl_fork 创建子进程实现异步,适用于…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证码…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $imag…

php 实现单链表

php 实现单链表

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

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php session 实现购物车

php session 实现购物车

PHP Session 实现购物车的方法 初始化 Session 在 PHP 脚本的最开始调用 session_start() 函数,确保会话已启用。这通常在页面的顶部完成。 session_st…