当前位置:首页 > PHP

php容器实现

2026-02-14 11:22:02PHP

PHP容器的实现方法

依赖注入容器(Dependency Injection Container)

依赖注入容器是PHP中实现容器的核心机制。通过容器管理对象的创建和依赖关系,减少硬编码依赖。以下是一个简单的依赖注入容器实现示例:

class Container {
    protected $instances = [];

    public function bind($abstract, $concrete = null) {
        if (is_null($concrete)) {
            $concrete = $abstract;
        }
        $this->instances[$abstract] = $concrete;
    }

    public function make($abstract, $parameters = []) {
        if (!isset($this->instances[$abstract])) {
            $this->bind($abstract);
        }
        return $this->resolve($this->instances[$abstract], $parameters);
    }

    protected function resolve($concrete, $parameters) {
        if ($concrete instanceof Closure) {
            return $concrete($this, $parameters);
        }
        $reflector = new ReflectionClass($concrete);
        if (!$reflector->isInstantiable()) {
            throw new Exception("Class {$concrete} is not instantiable");
        }
        $constructor = $reflector->getConstructor();
        if (is_null($constructor)) {
            return new $concrete;
        }
        $dependencies = $constructor->getParameters();
        $instances = $this->resolveDependencies($dependencies);
        return $reflector->newInstanceArgs($instances);
    }

    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->make($dependency->name);
            }
        }
        return $dependencies;
    }
}

使用PSR-11标准容器

PSR-11定义了容器接口规范,推荐使用符合该标准的容器实现。常见的PSR-11兼容容器包括:

php容器实现

  • PHP-DI
  • Symfony DependencyInjection
  • Laravel容器
use Psr\Container\ContainerInterface;

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

    public function get($id) {
        if (!$this->has($id)) {
            throw new ServiceNotFoundException($id);
        }
        return $this->services[$id];
    }

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

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

自动装配实现

现代PHP框架通常支持自动装配,容器可以自动解析类依赖关系而无需显式配置:

php容器实现

class AutowiringContainer extends Container {
    public function make($abstract, $parameters = []) {
        try {
            return parent::make($abstract, $parameters);
        } catch (Exception $e) {
            if (class_exists($abstract)) {
                return $this->resolve($abstract, $parameters);
            }
            throw $e;
        }
    }
}

服务提供者模式

在大型应用中,通常使用服务提供者来组织容器绑定逻辑:

interface ServiceProvider {
    public function register(Container $container);
}

class DatabaseServiceProvider implements ServiceProvider {
    public function register(Container $container) {
        $container->bind('db', function() {
            return new DatabaseConnection(config('database'));
        });
    }
}

容器性能优化

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

  • 使用缓存解析结果
  • 预编译容器
  • 延迟加载服务
class OptimizedContainer extends Container {
    private $resolved = [];

    public function make($abstract, $parameters = []) {
        if (isset($this->resolved[$abstract])) {
            return $this->resolved[$abstract];
        }
        $instance = parent::make($abstract, $parameters);
        $this->resolved[$abstract] = $instance;
        return $instance;
    }
}

以上方法展示了PHP容器的主要实现方式,从基础依赖注入到符合PSR标准的容器,再到自动装配和服务提供者等高级用法。实际项目中可根据需求选择合适的实现方案。

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

相关文章

php实现文件上传

php实现文件上传

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

php实现socket

php实现socket

PHP 实现 Socket 通信 PHP 可以通过 socket 扩展实现网络通信,支持 TCP/UDP 协议。以下是实现 Socket 通信的核心步骤和代码示例。 创建 TCP 服务器 // 创建…

php实现栈

php实现栈

栈的基本概念 栈(Stack)是一种遵循后进先出(LIFO)原则的数据结构。核心操作包括: push:元素入栈。 pop:元素出栈(返回并移除栈顶元素)。 peek:查看栈顶元素(不移…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Cont…

php实现上传图片

php实现上传图片

上传图片的基本流程 PHP 实现图片上传功能需要处理文件接收、验证、保存等步骤。以下是具体实现方法。 创建 HTML 表单 在 HTML 中创建一个表单,设置 enctype="multipart…

php实现即时通讯

php实现即时通讯

PHP 实现即时通讯的方案 即时通讯(IM)可以通过多种方式实现,PHP 作为服务器端语言,通常需要结合前端技术(如 WebSocket、AJAX)或第三方服务来实现实时通信。以下是几种常见的实现方式…