发布于2026-07-12 阅读(0)
扫一扫,手机访问
先说几个核心判断:PHP项目不是“需要”依赖注入,而是只要业务逻辑开始跨类协作,手动 new 就会立刻失控。
你写一个 UserService 调用 Mailer 发邮件,再调用 Logger 记日志,再调用 Cache 缓存结果——这四个类如果全靠构造函数里 new 出来,那换数据库驱动、切日志后端、改缓存引擎时,你得翻遍所有服务类去改实例化代码。

new,就等于锁死了实现常见错误现象:UserRepository 构造函数直接 new MySQLConnection(...);测试时想 mock 数据库?不可能——new 是硬编码,不是接口契约。
DatabaseInterface,只要类内部 new 了具体实现,接口就形同虚设__construct() 参数注入才是解耦起点这不是“更优雅的写法”,而是把依赖关系从运行时(new)移到编译时(类型提示),让容器能看懂你要什么。
DatabaseInterface $db,而不是 $db 或 object $db,否则自动装配失效LoggerInterface $logger = null 会破坏自动装配链,真要可选,用 setter 或容器条件绑定工厂看似解耦,实则把 new 从类里挪到工厂里,问题照旧:工厂本身变成高耦合中心,且无法支持多实例策略(比如单例 vs 每次新建)。
PHP-DI、Lara vel 容器默认启用自动装配,但对 LoggerInterface 这类抽象,它不知道你想要 Monolog 还是 Syslog。不绑定,运行时报 No entry or class found。
$container->set(LoggerInterface::class, MonologLogger::class)php-di/php-di 的 debug 模式定位最常被忽略的一点:解耦不是目的,是手段。真正关键的是——你能否在不改任何业务类的前提下,把 FileLogger 换成 SentryLogger,把 MySQLDriver 切到 PostgreSQLDriver,甚至把整个支付模块替换成第三方 SDK。做不到这点,DI 就只是换了个姿势写 new。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8