PHP中可以使用递归来实现DI(Dependency Injection)的功能。下面是一个简单的示例:
class Container {
private $services = [];
public function register($name, $service) {
$this->services[$name] = $service;
}
public function resolve($name) {
if (!isset($this->services[$name])) {
throw new Exception("Service not found: $name");
}
$service = $this->services[$name];
if (is_callable($service)) {
return $service($this);
}
return $service;
}
}
$container = new Container();
$container->register('logger', function($c) {
return new Logger();
});
$container->register('database', function($c) {
return new Database($c->resolve('logger'));
});
class Logger {
public function log($message) {
echo "Logging: $message\n";
}
}
class Database {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function query($sql) {
$this->logger->log("Executing query: $sql");
// 执行查询逻辑...
}
}
$database = $container->resolve('database');
$database->query('SELECT * FROM users');
在上面的示例中,Container
类用于注册和解析服务。register
方法用于注册一个服务,resolve
方法用于解析一个已注册的服务。
Logger
类和Database
类是两个示例服务。Database
类依赖Logger
类,通过构造函数注入方式实现依赖注入。
在示例中,首先创建了一个Container
实例,并注册了logger
和database
两个服务。logger
服务使用了一个匿名函数来创建Logger
实例,database
服务使用了一个匿名函数来创建Database
实例,并通过resolve
方法解析了logger
服务。
最后,通过resolve
方法解析database
服务,并调用query
方法执行查询操作。在query
方法中,会通过依赖注入的方式获取到logger
服务,并调用其log
方法记录日志。
这样,就实现了简单的DI功能。
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站