当前位置:首页 > PHP

php 容器实现

2026-02-14 08:58:13PHP

PHP 容器的实现方法

依赖注入容器

PHP 容器通常指依赖注入容器(Dependency Injection Container),用于管理对象的创建和依赖关系。以下是一个简单的实现方式:

class Container {
    private $services = [];
    private $instances = [];

    public function register(string $name, callable $resolver) {
        $this->services[$name] = $resolver;
    }

    public function get(string $name) {
        if (!isset($this->instances[$name])) {
            if (!isset($this->services[$name])) {
                throw new Exception("Service {$name} not found");
            }
            $this->instances[$name] = $this->services[$name]($this);
        }
        return $this->instances[$name];
    }
}

自动依赖解析

更高级的容器可以自动解析类的依赖关系:

class Container {
    public function make($className) {
        $reflector = new ReflectionClass($className);
        if (!$reflector->isInstantiable()) {
            throw new Exception("Class {$className} is not instantiable");
        }

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

        $parameters = $constructor->getParameters();
        $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");
                }
            } else {
                $dependencies[] = $this->make($dependency->name);
            }
        }

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

使用 PSR-11 标准容器

PHP-FIG 的 PSR-11 标准定义了容器接口:

interface ContainerInterface {
    public function get($id);
    public function has($id);
}

实现 PSR-11 兼容容器:

class PsrContainer implements ContainerInterface {
    private $entries = [];

    public function get($id) {
        if (!$this->has($id)) {
            throw new NotFoundException("Entry {$id} not found");
        }
        return $this->entries[$id]($this);
    }

    public function has($id) {
        return isset($this->entries[$id]);
    }

    public function set($id, callable $concrete) {
        $this->entries[$id] = $concrete;
    }
}

使用现有容器库

PHP 生态系统中有多个成熟的容器实现:

  1. PHP-DI:功能丰富的依赖注入容器

    $container = new DI\Container();
    $container->set('service', function() {
        return new SomeService();
    });
  2. Laravel 容器:Laravel 框架的核心组件

    $container = new Illuminate\Container\Container();
    $container->bind('service', SomeService::class);
  3. Symfony DependencyInjection:Symfony 的容器组件

    $container = new Symfony\Component\DependencyInjection\ContainerBuilder();
    $container->register('service', SomeService::class);

容器配置方式

常见配置方式包括:

  • 代码配置

    $container->register('db', function() {
        return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
    });
  • 文件配置(YAML/XML)

    services:
      db:
        class: PDO
        arguments: ['mysql:host=localhost;dbname=test', 'user', 'pass']
  • 注解配置

    /
     * @Injectable
     */
    class SomeService {
        // ...
    }

性能优化技巧

对于生产环境,可以考虑以下优化:

php 容器实现

  • 预编译容器(如 Symfony 的容器编译)
  • 使用代理类延迟加载
  • 缓存解析结果
  • 避免过度使用容器(直接实例化简单对象)

以上方法展示了 PHP 容器从基础到高级的实现方式,可根据项目需求选择合适的实现方案。

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

相关文章

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…

php 实现 java md5

php 实现 java md5

在 PHP 中实现与 Java 相同的 MD5 哈希算法,关键在于确保编码和输出格式的一致性。以下是具体实现方法和注意事项: 确保字符串编码一致 Java 的 String.getBytes() 默…

php实现下载文件

php实现下载文件

使用PHP实现文件下载 PHP可以通过设置HTTP头信息实现文件下载功能。以下为几种常见方法: 使用readfile()函数 $file = 'path/to/file.pdf'; if (fi…

php实现转发

php实现转发

PHP 实现转发的方法 使用 header 函数进行 URL 转发 通过 header 函数可以实现简单的 URL 转发,将用户重定向到另一个页面。 header("Location: https:…

php怎么实现分页

php怎么实现分页

实现分页的基本步骤 在PHP中实现分页通常需要结合数据库查询和前端展示。以下是常见的实现方法: 数据库查询部分 使用SQL的LIMIT子句限制返回的记录数: SELECT * FROM table…