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

自动依赖解析

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

php 容器实现

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

单例模式支持

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

php 容器实现

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实现websocket

php实现websocket

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

php实现聊天

php实现聊天

实现 PHP 聊天功能的方法 使用 WebSocket 和 PHP 实现实时聊天 WebSocket 是一种全双工通信协议,适合实现实时聊天功能。PHP 可以通过 Ratchet 库实现 WebSo…

php无限分类的实现

php无限分类的实现

PHP无限分类的实现 无限分类是一种常见的树形结构数据组织方式,适用于商品分类、菜单管理、地区选择等场景。以下是几种实现方法: 递归实现法 递归是最直观的实现方式,通过函数自身调用来遍历子分类。数据…

php搜索功能实现的

php搜索功能实现的

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

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php实现注册登录

php实现注册登录

PHP 注册功能实现 创建数据库表(以 MySQL 为例) CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…