当前位置:首页 > 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容器实现可以参考:

php 容器实现

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

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

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

相关文章

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

php实现分页

php实现分页

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

php 实现验证码

php 实现验证码

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

vue拖拽容器实现

vue拖拽容器实现

Vue 拖拽容器实现方法 在 Vue 中实现拖拽容器功能可以通过原生 HTML5 的拖放 API 或第三方库如 vuedraggable 来实现。以下是两种方法的详细说明。 使用 HTML5 拖放…

php 实现评论

php 实现评论

实现 PHP 评论功能 数据库设计 创建数据库表存储评论数据,通常包含以下字段: id:评论唯一标识 user_id:用户ID content:评论内容 created_at:评论时间 parent…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…