当前位置:首页 > PHP

php 实现 ioc

2026-01-29 16:50:12PHP

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

IOC(Inversion of Control)是一种设计模式,通过将对象的创建和管理交给容器来实现解耦。在 PHP 中,可以通过依赖注入(DI)和容器类来实现 IOC。

实现一个简单的 IOC 容器

以下是一个基础的 IOC 容器实现,支持绑定和解析依赖:

<?php
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) {
        if (!isset($this->bindings[$abstract])) {
            return $this->build($abstract);
        }

        $concrete = $this->bindings[$abstract]['concrete'];
        $shared = $this->bindings[$abstract]['shared'];

        if ($shared && isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }

        $object = $this->build($concrete);

        if ($shared) {
            $this->instances[$abstract] = $object;
        }

        return $object;
    }

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

    // 解析依赖
    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->name}");
                }
            } else {
                $dependencies[] = $this->make($dependency->name);
            }
        }
        return $dependencies;
    }
}

使用示例

定义一个接口和实现类:

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

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

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

绑定并解析依赖:

$container = new Container();

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

// 解析实例
$logger = $container->make(LoggerInterface::class);
$logger->log("Hello IOC Container");

使用第三方库

对于更成熟的 IOC 容器实现,可以使用以下流行的 PHP 库:

  • Laravel 的 IOC 容器:Laravel 框架内置了强大的 IOC 容器,可以直接使用或独立集成。
  • PHP-DI:一个专为 PHP 设计的依赖注入容器,支持自动装配和注解。
  • Pimple:一个轻量级的依赖注入容器,适合小型项目。

使用 PHP-DI 实现 IOC

安装 PHP-DI:

composer require php-di/php-di

示例代码:

php 实现 ioc

<?php
require 'vendor/autoload.php';

use DI\Container;
use DI\ContainerBuilder;

$builder = new ContainerBuilder();
$builder->addDefinitions([
    LoggerInterface::class => DI\create(FileLogger::class)
]);
$container = $builder->build();

$logger = $container->get(LoggerInterface::class);
$logger->log("Hello PHP-DI");

总结

实现 IOC 容器的核心是通过反射解析依赖并自动注入。自定义容器适合学习原理,而生产环境推荐使用成熟的库如 PHP-DI 或 Laravel 容器。

标签: phpioc
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

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

php实现websocket

php实现websocket

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

php实现栈

php实现栈

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

php搜索功能实现的

php搜索功能实现的

PHP 搜索功能实现方法 数据库搜索实现 使用 SQL 的 LIKE 语句进行模糊匹配,适用于小型网站和简单搜索需求。 $searchTerm = $_GET['search']; $query =…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php变量的实现

php变量的实现

PHP变量的实现机制 PHP变量的实现基于Zend引擎的底层数据结构。核心结构体zval用于存储变量类型和值,其设计允许动态类型转换和高效内存管理。 zval结构体 PHP变量通过zval结构体实现…