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

性能优化技巧

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

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

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

php 容器实现

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

相关文章

php实现分页

php实现分页

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

php实现文件上传

php实现文件上传

PHP 文件上传实现方法 在 PHP 中实现文件上传需要处理 HTML 表单和服务器端脚本。以下是详细步骤: 创建 HTML 表单 使用 enctype="multipart/form-data"…

php 实现自动收货

php 实现自动收货

PHP 实现自动收货功能 自动收货功能通常用于电商系统,在订单超过一定时间未手动确认收货时自动完成订单。以下是实现方法: 数据库设计 需要订单表包含以下关键字段: CREATE TABLE…

php实现websocket

php实现websocket

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

php实现注册

php实现注册

注册功能实现步骤 数据库准备 创建用户表,包含字段如id、username、password、email等。示例SQL: CREATE TABLE users ( id INT AUTO_…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必要…