当前位置:首页 > PHP

php容器实现

2026-02-28 10:32:46PHP

PHP 容器实现

在 PHP 中,容器(Container)通常指依赖注入容器(Dependency Injection Container),用于管理对象的创建和依赖关系。以下是实现 PHP 容器的几种常见方法:

使用数组实现简单容器

通过数组存储服务定义和实例,实现基本的容器功能。

php容器实现

class Container {
    protected $services = [];

    public function set($name, callable $definition) {
        $this->services[$name] = $definition;
    }

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

使用反射实现自动依赖注入

通过 PHP 的 Reflection API 自动解析类的依赖关系并实例化对象。

class Container {
    protected $instances = [];

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

        $reflector = new ReflectionClass($class);
        $constructor = $reflector->getConstructor();

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

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

        foreach ($parameters as $parameter) {
            $dependency = $parameter->getClass();
            if ($dependency) {
                $dependencies[] = $this->get($dependency->name);
            } else {
                throw new Exception("Cannot resolve dependency: {$parameter->name}");
            }
        }

        $this->instances[$class] = $reflector->newInstanceArgs($dependencies);
        return $this->instances[$class];
    }
}

使用 PSR-11 标准实现容器

遵循 PSR-11(Container Interface)标准实现容器,提高与其他框架的兼容性。

php容器实现

use Psr\Container\ContainerInterface;

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

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

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

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

使用现有容器库

直接使用成熟的 PHP 容器库,如 PHP-DI、Laravel 的容器等。

// 使用 PHP-DI
$container = new DI\Container();
$container->set('service', function() {
    return new SomeService();
});
$service = $container->get('service');

实现容器的单例模式

确保某些服务在容器中以单例模式存在,避免重复创建。

class Container {
    protected $singletons = [];

    public function singleton($name, callable $definition) {
        $this->singletons[$name] = $definition;
    }

    public function get($name) {
        if (isset($this->singletons[$name])) {
            if (!isset($this->instances[$name])) {
                $this->instances[$name] = $this->singletons[$name]($this);
            }
            return $this->instances[$name];
        }
        throw new Exception("Service not found: {$name}");
    }
}

通过以上方法,可以实现不同复杂度的 PHP 容器,满足项目需求。

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

相关文章

php实现websocket

php实现websocket

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

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…

php 实现队列

php 实现队列

PHP 实现队列的方法 PHP 可以通过多种方式实现队列功能,以下是几种常见的实现方法: 使用数组实现队列 PHP 数组可以通过 array_push 和 array_shift 函数模拟队列的先进…

php 实现跳转

php 实现跳转

PHP 实现页面跳转的方法 在PHP中,实现页面跳转可以通过多种方式完成,以下是几种常用的方法: 使用header函数 header函数是PHP中最常用的跳转方法,通过发送HTTP头部信息实现跳转。…

php发帖实现

php发帖实现

PHP 发帖实现方法 数据库准备 创建一个数据库表用于存储帖子信息,常见的字段包括帖子ID、标题、内容、作者、发布时间等。SQL示例: CREATE TABLE posts ( id INT…