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

自动依赖注入

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

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 示例:

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

接口绑定实现

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

php ioc 实现

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实现文件下载

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

php实现上传

php实现上传

PHP 文件上传实现 HTML 表单设置 创建一个包含文件上传字段的 HTML 表单,确保表单的 enctype 属性设置为 multipart/form-data,这是文件上传必需的设置。 <…

php 函数实现

php 函数实现

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

php 线程实现

php 线程实现

PHP 线程实现方法 PHP 本身是单线程语言,但可以通过扩展或库实现多线程功能。以下是几种常见的实现方式: 使用 pthreads 扩展 pthreads 是一个 PHP 扩展,允许在 PHP 中…

php 实现无限分类

php 实现无限分类

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、菜单管理等。以下是几种常见的实现方式: 邻接列表模型(Adjacency List) 这是最简单的实现方式,每个分类记录存储其父…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…