当前位置:首页 > PHP

php ioc 实现

2026-02-27 18:57:44PHP

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

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

基础 IOC 容器实现

一个简单的 IOC 容器可以通过数组存储依赖关系,并支持绑定和解析功能。

class Container {
    protected $bindings = [];

    public function bind($abstract, $concrete) {
        $this->bindings[$abstract] = $concrete;
    }

    public function make($abstract) {
        if (!isset($this->bindings[$abstract])) {
            throw new Exception("No binding found for {$abstract}");
        }
        $concrete = $this->bindings[$abstract];

        if ($concrete instanceof Closure) {
            return $concrete($this);
        }
        return new $concrete();
    }
}

使用示例:

$container = new Container();
$container->bind('Database', function() {
    return new Database('localhost', 'root', 'password');
});

$db = $container->make('Database');

自动依赖注入

通过反射机制实现自动解析类的依赖关系。

php ioc 实现

class Container {
    protected $bindings = [];

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

    public function make($abstract) {
        if (isset($this->bindings[$abstract])) {
            $concrete = $this->bindings[$abstract];
            if ($concrete instanceof Closure) {
                return $concrete($this);
            }
            $abstract = $concrete;
        }

        $reflector = new ReflectionClass($abstract);
        if (!$reflector->isInstantiable()) {
            throw new Exception("Class {$abstract} is not instantiable");
        }

        $constructor = $reflector->getConstructor();
        if (is_null($constructor)) {
            return new $abstract();
        }

        $dependencies = $constructor->getParameters();
        $instances = $this->resolveDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }

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

使用示例:

class UserService {
    protected $db;
    public function __construct(Database $db) {
        $this->db = $db;
    }
}

$container = new Container();
$container->bind('Database', MySQLDatabase::class);
$userService = $container->make(UserService::class);

使用第三方库

PHP 生态中有成熟的 IOC 容器库,如 PHP-DILaravel 的 Container

PHP-DI 示例:

php ioc 实现

require_once 'vendor/autoload.php';

use DI\ContainerBuilder;

$builder = new ContainerBuilder();
$builder->addDefinitions([
    'Database' => function() {
        return new Database('localhost', 'root', 'password');
    },
    UserService::class => \DI\autowire()
]);

$container = $builder->build();
$userService = $container->get(UserService::class);

单例绑定

某些依赖可能需要在全局共享实例,可以通过单例模式绑定。

class Container {
    protected $instances = [];

    public function singleton($abstract, $concrete) {
        $this->bindings[$abstract] = $concrete;
        $this->instances[$abstract] = null;
    }

    public function make($abstract) {
        if (isset($this->instances[$abstract])) {
            return $this->instances[$abstract];
        }
        $instance = parent::make($abstract);
        $this->instances[$abstract] = $instance;
        return $instance;
    }
}

使用示例:

$container->singleton('Database', MySQLDatabase::class);
$db1 = $container->make('Database');
$db2 = $container->make('Database');
var_dump($db1 === $db2); // true

接口绑定实现

通过绑定接口到具体实现类,可以方便替换依赖。

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

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

$container->bind(LoggerInterface::class, FileLogger::class);
$logger = $container->make(LoggerInterface::class);

通过以上方法,可以在 PHP 中灵活实现 IOC 容器,管理依赖关系并提升代码的可测试性和可维护性。

标签: phpioc
分享给朋友:

相关文章

php实现栈

php实现栈

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

php购物车实现

php购物车实现

PHP购物车实现方法 使用PHP实现购物车功能可以通过多种方式完成,以下是几种常见的实现方法: Session存储购物车数据 利用PHP的$_SESSION超全局变量存储购物车数据是最简单的方法。…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php 伪静态实现

php 伪静态实现

PHP 伪静态实现方法 伪静态(URL Rewrite)是一种通过服务器配置将动态URL转换为静态URL的技术,提升URL的可读性和SEO效果。以下是几种常见的实现方式: 使用Apache的mo…