php 容器实现
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 生态系统中有多个成熟的容器实现:
-
PHP-DI:功能丰富的依赖注入容器
$container = new DI\Container(); $container->set('service', function() { return new SomeService(); }); -
Laravel 容器:Laravel 框架的核心组件
$container = new Illuminate\Container\Container(); $container->bind('service', SomeService::class); -
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 容器从基础到高级的实现方式,可根据项目需求选择合适的实现方案。







