当前位置:首页 > 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 可以通过多种方式实现打印功能,具体取决于打印的目标(如打印机、PDF、网页等)和需求(如直接打印、生成打印预览等)。以下是几种常见的实现方式: 使用 JavaSc…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…

php mvc实现

php mvc实现

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

php实现apk下载

php实现apk下载

实现APK下载的PHP代码 创建一个简单的PHP脚本来处理APK文件的下载请求,确保文件传输正确且安全。 <?php $file = 'path/to/your/app.apk'; if (f…