php ioc 实现
PHP 实现 IOC(控制反转)容器
IOC(Inversion of Control)是一种设计模式,通过将对象的创建和管理交给容器来实现解耦。在 PHP 中,可以通过以下几种方式实现 IOC 容器。
基础 IOC 容器实现
一个简单的 IOC 容器可以通过数组存储依赖关系,并支持绑定和解析功能。
class Container {
protected $bindings = [];
public function bind($abstract, $concrete) {
$this->bindings[$abstract] = $concrete;
}
public function make($abstract) {
if (!isset($this->bindings[$abstract])) {
throw new Exception("No binding found for {$abstract}");
}
$concrete = $this->bindings[$abstract];
if ($concrete instanceof Closure) {
return $concrete($this);
}
return new $concrete();
}
}
使用示例:
$container = new Container();
$container->bind('Database', function() {
return new Database('localhost', 'root', 'password');
});
$db = $container->make('Database');
自动依赖注入
通过反射机制实现自动解析类的依赖关系。

class Container {
protected $bindings = [];
public function bind($abstract, $concrete = null) {
if (is_null($concrete)) {
$concrete = $abstract;
}
$this->bindings[$abstract] = $concrete;
}
public function make($abstract) {
if (isset($this->bindings[$abstract])) {
$concrete = $this->bindings[$abstract];
if ($concrete instanceof Closure) {
return $concrete($this);
}
$abstract = $concrete;
}
$reflector = new ReflectionClass($abstract);
if (!$reflector->isInstantiable()) {
throw new Exception("Class {$abstract} is not instantiable");
}
$constructor = $reflector->getConstructor();
if (is_null($constructor)) {
return new $abstract();
}
$dependencies = $constructor->getParameters();
$instances = $this->resolveDependencies($dependencies);
return $reflector->newInstanceArgs($instances);
}
protected function resolveDependencies($dependencies) {
$results = [];
foreach ($dependencies as $dependency) {
$results[] = $this->make($dependency->getClass()->name);
}
return $results;
}
}
使用示例:
class UserService {
protected $db;
public function __construct(Database $db) {
$this->db = $db;
}
}
$container = new Container();
$container->bind('Database', MySQLDatabase::class);
$userService = $container->make(UserService::class);
使用第三方库
PHP 生态中有成熟的 IOC 容器库,如 PHP-DI 或 Laravel 的 Container。
PHP-DI 示例:

require_once 'vendor/autoload.php';
use DI\ContainerBuilder;
$builder = new ContainerBuilder();
$builder->addDefinitions([
'Database' => function() {
return new Database('localhost', 'root', 'password');
},
UserService::class => \DI\autowire()
]);
$container = $builder->build();
$userService = $container->get(UserService::class);
单例绑定
某些依赖可能需要在全局共享实例,可以通过单例模式绑定。
class Container {
protected $instances = [];
public function singleton($abstract, $concrete) {
$this->bindings[$abstract] = $concrete;
$this->instances[$abstract] = null;
}
public function make($abstract) {
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}
$instance = parent::make($abstract);
$this->instances[$abstract] = $instance;
return $instance;
}
}
使用示例:
$container->singleton('Database', MySQLDatabase::class);
$db1 = $container->make('Database');
$db2 = $container->make('Database');
var_dump($db1 === $db2); // true
接口绑定实现
通过绑定接口到具体实现类,可以方便替换依赖。
interface LoggerInterface {
public function log($message);
}
class FileLogger implements LoggerInterface {
public function log($message) {
file_put_contents('log.txt', $message, FILE_APPEND);
}
}
$container->bind(LoggerInterface::class, FileLogger::class);
$logger = $container->make(LoggerInterface::class);
通过以上方法,可以在 PHP 中灵活实现 IOC 容器,管理依赖关系并提升代码的可测试性和可维护性。






