当前位置:首页 > 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();
});

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

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

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

php 实现IOC

标签: phpIOC
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

PHP 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (in…

php实现搜索功能

php实现搜索功能

实现基本的搜索功能 在PHP中实现搜索功能通常涉及数据库查询。以下是一个简单的实现方式,假设使用MySQL数据库: <?php // 连接数据库 $conn = new mysqli('loc…

php 实现自动收货

php 实现自动收货

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

php实现websocket

php实现websocket

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

php 实现验证码

php 实现验证码

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