php怎么实现依赖注入
依赖注入的实现方法
在PHP中,依赖注入(Dependency Injection,DI)是一种设计模式,用于解耦组件之间的依赖关系。以下是几种常见的实现方式:
手动依赖注入
手动注入是最基础的方式,通过构造函数或方法参数显式传递依赖对象。
class DatabaseConnection {
public function connect() {
return "Database connected";
}
}
class UserRepository {
private $dbConnection;
public function __construct(DatabaseConnection $dbConnection) {
$this->dbConnection = $dbConnection;
}
public function getUsers() {
$this->dbConnection->connect();
return "Fetching users";
}
}
$db = new DatabaseConnection();
$userRepo = new UserRepository($db);
echo $userRepo->getUsers();
使用容器实现依赖注入
依赖注入容器(DIC)可以自动管理依赖关系,常见的PHP容器包括PHP-DI、Laravel容器等。
// 使用PHP-DI示例
require_once 'vendor/autoload.php';
use DI\ContainerBuilder;
$containerBuilder = new ContainerBuilder();
$container = $containerBuilder->build();
$container->set('DatabaseConnection', function() {
return new DatabaseConnection();
});
$container->set('UserRepository', function($container) {
return new UserRepository($container->get('DatabaseConnection'));
});
$userRepo = $container->get('UserRepository');
echo $userRepo->getUsers();
接口绑定与实现
通过接口绑定具体实现,提高代码的可替换性和可测试性。
interface DatabaseInterface {
public function connect();
}
class MySQLDatabase implements DatabaseInterface {
public function connect() {
return "MySQL connected";
}
}
class UserRepository {
private $db;
public function __construct(DatabaseInterface $db) {
$this->db = $db;
}
}
$db = new MySQLDatabase();
$userRepo = new UserRepository($db);
自动装配
现代PHP框架(如Laravel)支持自动装配,容器会根据类型提示自动解析依赖。
// Laravel中的示例
class UserController extends Controller {
public function __construct(UserRepository $users) {
$this->users = $users;
}
}
// 框架会自动注入UserRepository实例
注解方式注入
某些库支持通过注解声明依赖关系,如PHP-DI的@Inject注解。
use DI\Annotation\Inject;
class UserService {
/
* @Inject
* @var UserRepository
*/
private $userRepo;
}
选择适合项目规模和复杂度的实现方式,小型项目可手动注入,大型项目推荐使用容器管理依赖。







