新闻中心
PHP依赖注入核心概念说明_PHP实现DI容器基础教程
依赖注入本质是将对象依赖关系从内部创建改为外部传入,提升解耦、可测性与可替换性;常用构造函数注入,辅以setter注入,接口注入在PHP中基本不用;简易DI容器核心为绑定、解析与缓存。

依赖注入(DI)本质是把对象的依赖关系从内部创建改为外部传入,让类更专注自身职责,也更容易测试和替换实现。
为什么需要依赖注入
传统写法中,类自己 new 依赖对象,导致耦合度高、难以替换实现、不方便单元测试。比如一个订单服务依赖支付网关,如果硬编码 new Alipay(),换成 WechatPay 就得改代码。依赖注入把“谁来创建”和“谁来使用”分开,运行时由容器决定注入哪个实例。
三种注入方式怎么选
构造函数注入最常用,适合必填依赖;setter 注入适合可选或后期可变的依赖;接口注入用得少,PHP 一般不推荐。实际项目中优先用构造函数注入,语义清晰且能保证依赖不为空。
- 构造注入:在 __construct() 中接收参数,赋值给属性
- Setter 注入:提供 public setXxx() 方法,在外部调用传入依赖
- 接口注入:依赖类实现特定接口,容器通过接口识别并注入 —— PHP 里基本不用
手写一个极简 DI 容器
核心就三件事:绑定(bind)、解析(make)、缓存(单例支持)。不需要 Composer 或复杂反射,几行就能跑起来:
晓象AI资讯阅读神器
晓象-AI时代的资讯阅读神器
72
查看详情
立即学习“PHP免费学习笔记(深入)”;
// 示例:简单容器类class Container {
private $bindings = [];
private $instances = [];
public function bind($abstract, $concrete = null) {
$this->bindings[$abstract] = $concrete ?: $abstract;
}
public function make($abstract) {
if (isset($this->instances[$abstract])) {
return $this->instances[$abstract];
}
$concrete = $this->bindings[$abstract] ?? $abstract;
$obj = new $concrete();
$this->instances[$abstract] = $obj;
return $obj;
}
}
绑定与解析的实际用法
先 bind 接口或抽象类到具体实现,再 make 获取实例。这样后续换实现只需改 bind 行,业务代码完全不动。
- 绑定接口:$container->bind('PaymentGateway', 'WechatPay');
- 绑定闭包:$container->bind('Logger', function() { return new FileLogger('/var/log/app.log'); });
- 解析使用:$orderService = new OrderService($container->make('PaymentGateway'));
基本上就这些。不复杂但容易忽略的是:别在容器里做太多逻辑,它只管“给什么、给谁”,具体怎么初始化交给绑定时定义。
以上就是PHP依赖注入核心概念说明_PHP实现DI容器基础教程的详细内容,更多请关注php中文网其它相关文章!
# 转化成
# 台州抖音seo营销
# 官网seo运营面试
# 无锡百度seo价格
# 沈阳外贸营销推广费用
# 湖北seo 是什么
# 鄂州seo搜索推广策划
# 阳泉关键词公司排名
# 长岛品牌网站优化
# 东莞网站付费推广平台
# 休闲网站推广热线
# 就能
# 太多
# 的是
# php
# 转换成
# 谁来
# 不符合
# 转数
# 绑定
# 遍历
# gate
# 为什么
# ai
# app
# 编码
# composer
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
微信怎么把收藏的内容分类管理 微信收藏内容标签分类方法
C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程
如何在网页中实现特定地点的随机图片展示
知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法
poki免费入口快捷访问 poki人气小游戏直接玩站点
Go RPC HTTP服务正确实现与常见陷阱解析
如何使用J*aScript精确选择并批量修改特定父元素下子链接的样式
CSS Grid如何控制元素对齐_align-items与justify-items组合使用
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
夸克浏览器图书入口 夸克手机浏览器阅读入口
汽水音乐网页版使用入口_汽水音乐电脑版播放指南
反效果?《战地6》免费试玩开启后玩家数不升反降
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
Node.js CSV 数据处理:基于字段值条件过滤整条记录的策略
汽水音乐车机版横屏版7.1 汽水音乐车机版横屏版下载入口
漫蛙2网页版漫画入口 漫蛙漫画在线官方登录
Go语言中Map存储的结构体如何调用指针方法:深入解析与实践
Golang如何实现Web接口签名验证_Golang Web接口签名校验开发方法
EMS快递官网app_中国邮政速递物流手机客户端
html两个JS只运行一个怎么办_让双JS在html中都运行方法【技巧】
cad如何更改注释性对象的比例_cad注释性比例调整方法
谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作
LINUX怎么设置定时任务_LINUX crontab配置教程
Lar*el头像管理:图片缩放与旧文件删除的最佳实践
J*aScript井字棋(Tic-Tac-Toe)核心交互逻辑实现教程
12306选座如何查看座位示意图_12306座位示意图解读与使用
在VS Code中配置和运行Dart程序的完整步骤
拼多多赚钱渠道_拼多多收益来源
微信客户端如何收红包_微信客户端接收红包使用教程
在React函数组件中利用原生HTML5进行邮箱地址验证
MAC如何安全彻底地删除文件_MAC使用终端命令确保文件无法被恢复
C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
谷歌邮箱网页版官方页面入口 谷歌邮箱网页端快速访问
邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策
铁路12306改签能改到更早的车次吗_铁路12306改签提前车次规则
荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程
Win10如何清理注册表垃圾 Win10手动清理无效注册表【技巧】
vivo云服务网页版登录 怎么登录vivo云服务网页版
C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件
css滚动区域卡顿如何改善_css滚动问题用will-change优化渲染
可靠CSGO开箱平台解析 CSGO开箱网合集
品牌机怎么重装系统 联想/戴尔/惠普笔记本恢复出厂系统教程
蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接
Golang如何实现状态模式管理对象状态_Golang State模式实现技巧
AO3最新镜像入口 Archive of Our Own官方平台访问
怎样更改Windows系统的默认安装路径_避免C盘爆满的终极设置【技巧】
React列表渲染与独立状态管理:避免全局状态影响局部更新
微博网页版怎么开启两步验证_微博网页版账号安全两步验证设置方法


2025-12-16
浏览次数:次
返回列表