php ioc 实现
PHP IoC 实现方法
依赖注入容器
依赖注入(DI)是IoC的核心实现方式之一。通过容器管理对象的依赖关系,避免硬编码依赖。
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;
}
}
服务定位器模式
服务定位器是另一种实现IoC的方式,通过中央注册表获取服务实例。

class ServiceLocator {
private $services = [];
private $instantiated = [];
public function register(string $name, callable $resolver) {
$this->services[$name] = $resolver;
}
public function has(string $name): bool {
return isset($this->services[$name]);
}
public function get(string $name) {
if (!isset($this->instantiated[$name])) {
$this->instantiated[$name] = $this->services[$name]();
}
return $this->instantiated[$name];
}
}
接口绑定实现
通过接口绑定具体实现,实现松耦合。

interface LoggerInterface {
public function log(string $message);
}
class FileLogger implements LoggerInterface {
public function log(string $message) {
file_put_contents('log.txt', $message, FILE_APPEND);
}
}
$container = new Container();
$container->bind(LoggerInterface::class, FileLogger::class);
$logger = $container->make(LoggerInterface::class);
自动装配实现
利用反射自动解析依赖关系,减少手动配置。
class AutoWiringContainer extends Container {
public function make($abstract, $parameters = []) {
if (!isset($this->instances[$abstract])) {
$this->bind($abstract);
}
return parent::make($abstract, $parameters);
}
}
实际应用示例
展示如何在MVC框架中使用IoC容器。
class UserController {
private $userRepository;
public function __construct(UserRepository $userRepository) {
$this->userRepository = $userRepository;
}
}
$container = new Container();
$container->bind(UserRepository::class, DatabaseUserRepository::class);
$controller = $container->make(UserController::class);
以上实现方法展示了PHP中IoC容器的核心概念和不同实现方式,从基础的依赖注入到自动装配,可以根据项目需求选择适合的方案。






