当前位置:首页 > PHP

php 实现IOC

2026-02-28 09:02:15PHP

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

控制反转(IoC)是一种设计模式,用于解耦依赖关系。在 PHP 中,可以通过依赖注入(DI)或服务容器实现 IoC。以下是实现 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 make($abstract, $parameters = []) {
        if (!isset($this->bindings[$abstract])) {
            return $this->build($abstract, $parameters);
        }

        $concrete = $this->bindings[$abstract]['concrete'];
        if ($concrete === $abstract || is_string($concrete)) {
            $concrete = $this->build($concrete, $parameters);
        }

        return $concrete;
    }

    protected function build($concrete, $parameters) {
        $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 = $constructor->getParameters();
        $instances = $this->resolveDependencies($dependencies, $parameters);
        return $reflector->newInstanceArgs($instances);
    }

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

使用示例

定义服务接口和实现:

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

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

注册并解析依赖:

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

class UserService {
    protected $logger;

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

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

$userService = $container->make(UserService::class);
$userService->register('John Doe');

高级特性扩展

实现单例绑定:

public function singleton($abstract, $concrete = null) {
    $this->bind($abstract, $concrete, true);
}

protected $instances = [];

public function make($abstract, $parameters = []) {
    if (isset($this->instances[$abstract])) {
        return $this->instances[$abstract];
    }
    // ...原有逻辑
    if ($this->bindings[$abstract]['shared']) {
        $this->instances[$abstract] = $concrete;
    }
    return $concrete;
}

实现自动依赖解析:

protected function resolveDependencies($dependencies, $parameters) {
    $results = [];
    foreach ($dependencies as $dependency) {
        if (isset($parameters[$dependency->name])) {
            $results[] = $parameters[$dependency->name];
        } elseif ($dependency->getClass()) {
            $results[] = $this->make($dependency->getClass()->name);
        } elseif ($dependency->isDefaultValueAvailable()) {
            $results[] = $dependency->getDefaultValue();
        } else {
            throw new Exception("Unresolvable dependency: {$dependency->name}");
        }
    }
    return $results;
}

容器优化建议

使用闭包延迟加载:

$container->bind('service', function($container) {
    return new HeavyService();
});

实现接口绑定到多个实现:

php 实现IOC

$container->bind(LoggerInterface::class, function($container) {
    return new CompositeLogger([
        $container->make(FileLogger::class),
        $container->make(DatabaseLogger::class)
    ]);
});

通过以上方法可以实现一个功能完整的 PHP IoC 容器,支持依赖注入、单例管理和自动解析等功能。实际项目中可以考虑使用成熟的框架如 Laravel 的服务容器,它提供了更完善的实现。

标签: phpIOC
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP实现文件下载的方法 通过PHP实现文件下载功能,可以采用多种方式,以下是几种常见的实现方法: 使用header()函数强制下载 设置HTTP头信息,强制浏览器下载文件而非直接打开: $fi…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php实现登陆

php实现登陆

PHP 实现登录功能 创建登录表单 在 HTML 文件中创建一个登录表单,包含用户名和密码输入框,表单的 action 属性指向处理登录的 PHP 文件。 <form action="logi…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…

php实现注册登陆

php实现注册登陆

PHP 注册功能实现 创建数据库表结构(MySQL示例): CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…