当前位置:首页 > PHP

php实现容器

2026-03-12 22:16:53PHP

PHP 实现容器的方法

在 PHP 中,容器通常用于依赖注入(DI)和管理对象生命周期。以下是几种常见的实现方式:

使用 PSR-11 兼容容器

PHP-FIG 的 PSR-11 标准定义了容器接口,可以通过实现 Psr\Container\ContainerInterface 来创建标准容器:

use Psr\Container\ContainerInterface;

class Container implements ContainerInterface {
    private $services = [];

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

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

    public function set($id, $service) {
        $this->services[$id] = $service;
    }
}

依赖注入容器实现

更高级的容器可以支持自动依赖解析:

class DIContainer {
    private $definitions = [];
    private $instances = [];

    public function set($id, $definition) {
        $this->definitions[$id] = $definition;
    }

    public function get($id) {
        if (isset($this->instances[$id])) {
            return $this->instances[$id];
        }

        if (!isset($this->definitions[$id])) {
            throw new Exception("Service not defined: {$id}");
        }

        $definition = $this->definitions[$id];
        $instance = $this->resolve($definition);
        $this->instances[$id] = $instance;

        return $instance;
    }

    protected function resolve($definition) {
        if (is_callable($definition)) {
            return $definition($this);
        }

        if (is_string($definition) && class_exists($definition)) {
            $reflection = new ReflectionClass($definition);
            $constructor = $reflection->getConstructor();

            if (!$constructor) {
                return new $definition();
            }

            $parameters = $constructor->getParameters();
            $dependencies = [];

            foreach ($parameters as $parameter) {
                $type = $parameter->getType();
                if ($type && !$type->isBuiltin()) {
                    $dependencies[] = $this->get($type->getName());
                } else {
                    throw new Exception("Cannot resolve parameter: {$parameter->getName()}");
                }
            }

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

        return $definition;
    }
}

使用现有容器库

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

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

    $container = new DI\Container();
  2. Symfony DependencyInjection: Symfony 框架的组件

    $container = new Symfony\Component\DependencyInjection\ContainerBuilder();
  3. Laravel 容器: Laravel 框架的核心组件

    $container = new Illuminate\Container\Container();

容器配置示例

典型的容器配置和使用方式:

$container = new DIContainer();

// 注册服务
$container->set('database', function($c) {
    return new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
});

$container->set('user_repository', 'App\Repositories\UserRepository');

// 获取服务
$db = $container->get('database');
$userRepo = $container->get('user_repository');

容器的高级特性

成熟的容器通常支持以下特性:

php实现容器

  • 自动装配(Autowiring)
  • 服务标签(Service Tags)
  • 工厂方法(Factories)
  • 延迟加载(Lazy Loading)
  • 作用域管理(Scopes)
  • 参数注入(Parameter Injection)

选择容器实现时,应根据项目需求和复杂度决定是自行实现还是使用现有解决方案。对于大多数应用场景,成熟的容器库如 PHP-DI 或 Symfony DI 已经足够完善。

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

相关文章

php实现分页

php实现分页

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

php 实现聊天功能

php 实现聊天功能

PHP 实现聊天功能的方法 使用 WebSocket 和 Ratchet 库 WebSocket 是实现实时聊天的理想选择。Ratchet 是一个 PHP 库,用于处理 WebSocket 连接。…

php实现验证码的识别

php实现验证码的识别

验证码识别的基本方法 验证码识别通常分为手动实现和第三方工具两种方式。手动实现需要图像处理和机器学习知识,而第三方工具则更快捷。 使用Tesseract OCR识别验证码 Tesseract是一个开…

排序算法 php实现

排序算法 php实现

以下是用PHP实现的常见排序算法,每种算法均附示例代码和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置实现排序: function bubbleSort($arr) { $n = c…

php 实现多继承

php 实现多继承

在PHP中,原生不支持多继承,但可以通过以下几种方法模拟实现类似多继承的功能: 使用 trait Trait是PHP 5.4引入的特性,允许在类中复用代码片段,可以视为一种轻量级的继承机制。一个类可…

php下载文件实现

php下载文件实现

PHP 下载文件实现方法 使用 header() 函数强制下载 设置合适的 HTTP 头信息,强制浏览器下载文件而非直接打开。 $file_path = '/path/to/file.pdf'; $…