当前位置:首页 > PHP

php 容器实现

2026-02-28 08:05:05PHP

PHP 容器实现的核心概念

PHP 容器(Dependency Injection Container)是一种管理对象依赖关系的工具,通过自动解析和注入依赖来简化代码。以下是实现容器的关键方法:

基础容器实现

创建一个简单的容器类,包含绑定和解析功能:

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;
    }
}

自动依赖解析

通过反射自动解析类的依赖:

public function resolve($class) {
    $reflector = new ReflectionClass($class);

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

    $constructor = $reflector->getConstructor();

    if (is_null($constructor)) {
        return new $class;
    }

    $parameters = $constructor->getParameters();
    $dependencies = $this->resolveDependencies($parameters);

    return $reflector->newInstanceArgs($dependencies);
}

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->resolve($dependency->name);
        }
    }

    return $dependencies;
}

接口绑定实现

支持接口到具体类的绑定:

public function bindInterface($interface, $implementation) {
    $this->bind($interface, function($container) use ($implementation) {
        return $container->resolve($implementation);
    });
}

单例模式支持

确保某些类只实例化一次:

protected $instances = [];

public function singleton($abstract, $concrete) {
    $this->bind($abstract, function($container) use ($concrete) {
        if (!isset($this->instances[$abstract])) {
            $this->instances[$abstract] = $container->make($concrete);
        }
        return $this->instances[$abstract];
    });
}

实际使用示例

$container = new Container();
$container->bind('logger', FileLogger::class);
$container->singleton('db', Database::class);

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

高级容器特性

对于更复杂的场景,可以考虑实现:

  • 上下文绑定(根据调用环境提供不同实现)
  • 装饰器模式支持
  • 自动装配配置
  • 延迟加载
  • 标签系统

成熟的PHP容器实现可以参考:

  • Laravel的服务容器
  • PHP-DI
  • Pimple
  • Symfony的DependencyInjection组件

这些实现提供了更完善的功能和更好的性能,适合生产环境使用。

php 容器实现

标签: 容器php
分享给朋友:

相关文章

php实现文件下载

php实现文件下载

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

php实现websocket

php实现websocket

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

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HT…

php 实现登录

php 实现登录

PHP 登录功能实现 使用 PHP 实现登录功能通常需要结合数据库验证和会话管理。以下是一个基本的登录实现流程: 数据库准备 创建用户表存储用户名和密码(建议使用哈希加密): CREATE TAB…