当前位置:首页 > 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 实现文件下载的方法 使用 header() 函数强制下载 设置正确的 HTTP 头信息,强制浏览器下载文件而不是直接打开。 $file = 'path/to/file.pdf'; if (f…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php 实现排名

php 实现排名

PHP 实现排名的方法 在 PHP 中实现排名功能通常涉及对数据进行排序、计算排名以及输出结果。以下是几种常见的实现方式: 基本数组排序排名 $scores = [85, 92, 78, 95, 8…