尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Yii 2 向后兼容(BC)策略完全指南:从版本承诺到接口与类的兼容性判定规则

Yii 2 向后兼容(BC)策略完全指南:从版本承诺到接口与类的兼容性判定规则 后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载本篇指南以 Yii 2 框架核心团队维护的《Backwards Compatibility》英文版 / 俄文版为骨架系统讲解 Yii 2 对向后兼容Backwards Compatibility简称 BC的承诺边界哪些版本必须保持 100% 兼容、哪些版本允许少量例外并给出两张可直接套用的判定表——作为使用者的你在继承类、实现接口、覆写方法时的 BC 保障以及作为开发者的你修改框架公开 API 时必须遵守的红线。读完本文你将能判断一次 API 改动是否破坏兼容也能理解 Yii 2 为何把这类规则写在 UPGRADE.md 中强制文档化。版本号与 BC 承诺补丁版、次版本与主版本Yii 2 的版本号采用2.x.y.z形式其中z为0时可以省略参见 Yii 版本管理。BC 承诺与版本号一一对应是全文所有判定规则的总纲补丁版2.x.y.Z严格不破坏向后兼容。只允许包含 bug 修复不允许包含新功能唯一的例外是涉及安全问题的修复版本策略文档 中明确写明Must be 100% backward compatible to ensure worry-free upgrade. Only exception is security issues that may require breaking BC。补丁版的发布周期约 12 周无需 alpha/beta/RC 预发布。次版本2.x.Y尽量不引入不兼容改动。理想情况下只包含不影响 BC 的变更但现实中难以做到 100% 兼容因此任何例外都必须记录在 UPGRADE.md 中。次版本约 12 个月发布一次允许包含少量新功能。主版本2.X.0允许破坏 BC但必须提供完整的升级指南记录在UPGRADE-2.X.md中且需要 alpha、beta、RC 预发布流程。这一承诺与仓库的分支策略相呼应master是当前稳定主版本的开发分支每次发布新的主版本后旧版本会抽出一个2.(n-1).x维护分支专门承接补丁版。在 framework/composer.json 中可以看到branch-alias被配置为dev-master: 2.0.x-dev说明当前主分支开发的是 2.0.x 系列——这正是一个长期维护、严格保持补丁版兼容的典型状态。开发者视角的红线小结在 2.0.x 系列内你写的用户代码应当在任何补丁版之间无缝升级框架维护者则要保证次版本只破坏少量兼容并写进 UPGRADE.md补丁版本绝不破坏兼容。作为使用者你的代码对 Yii 2 的依赖契约BC 判定首先要区分视角。本节表格回答我应用开发者这样用框架框架升级后还保不保我。两张表分别对应接口Interface与类Class两种使用方式。接口使用场景使用场景是否保证 BC用接口做类型提示Type hint是调用接口方法是实现该接口并且…实现方法是为已实现的方法添加参数是为参数添加默认值是这里的逻辑是只要框架不删除、不修改接口签名你的实现代码哪怕方法签名略有扩展就依然兼容。框架中的一个典型例子是 framework/base/BootstrapInterface.php它只声明了一个bootstrap($app)方法且声明since 2.0——自 2.0 起该方法从未变更签名这正是接口级 BC 承诺的具体体现。类使用场景使用场景是否保证 BC用类做类型提示是创建该类的实例是继承该类是访问 public 属性是调用 public 方法是继承该类并且…访问 protected 属性是调用 protected 方法是覆写 public 属性是覆写 protected 属性是覆写 public 方法是覆写 protected 方法是添加新属性否添加新方法否为覆写的方法添加参数是为参数添加默认值是通过反射Reflection调用 private 方法否通过反射Reflection访问 private 属性否解读这张表需要区分两条线读与覆写是绿灯只要你不改变框架类的结构只是读取、调用、继承、覆写 public/protected 成员框架的升级都不会破坏你的代码。加与反射私有成员是红灯你在子类里新增属性或方法时框架升级后可能与你新增的成员撞名例如框架在新版本恰好加了同名方法所以不保证 BC同样通过反射窥探 private 成员属于越界使用框架不承诺任何兼容。这也是为什么 Yii 官方风格一贯主张扩展框架能力时优先走 public/protected 接口而不是依赖反射。作为开发者修改框架 API 时的 BC 判定本节是 Yii 2 核心维护团队修改框架自身 API 时使用的检查清单。表格中的否即红线改动前必须三思且破坏性改动必须写入 UPGRADE.md。修改接口Interface时的判定改动类型是否允许BC删除接口否修改名称或命名空间namespace否添加父接口是前提不随之添加新方法删除父接口否接口方法添加方法否删除方法否修改方法名否将方法移动到父接口是添加无默认值的参数否添加带默认值的参数否删除参数是仅限末尾参数为参数添加默认值否删除参数的默认值否为参数添加类型提示type hint否删除参数的类型提示否修改参数类型否修改返回类型否常量添加常量是删除常量否修改常量值是但可能被序列化的对象除外必须记录到 UPGRADE.md接口是框架与所有实现者、调用者之间最硬的契约因此规则几乎全红接口签名方法名、参数、类型、返回类型的任何变化都会让所有implements该接口的第三方代码立即失效。唯一宽裕的是常量添加常量是安全的修改常量值也允许——前提是常量值不是可能被序列化的对象这类对象被序列化后其值会固化改动会导致反序列化结果不一致且必须写进 UPGRADE.md 提醒使用者。修改类Class时的判定类本身改动类型是否允许BC删除类否将类改为 final否将类改为 abstract否修改名称或命名空间否修改父类是但原父类必须仍然是该类的祖先为类添加接口是删除类实现的接口否修改父类之所以有条件地放行是因为只要原来的父类还保留在继承链上子类既有代码的instanceof判断和类型提示就仍然成立。属性Properties改动类型public 属性protected 属性private 属性添加是是是删除否否是缩小可见性否否—private 本就是最小可见性移动到父类是是—private 是内部实现细节不受 BC 承诺保护可以随意添加、删除public/protected 一旦暴露就是对外契约只能加、不能删、不能缩小可见性。将属性移动到父类之所以允许是因为对使用者而言读取/写入路径不变。构造函数Constructors改动类型是否允许BC删除构造函数否缩小 public 构造函数的可见性否缩小 protected 构造函数的可见性否将构造函数移动到父类是public / protected 方法改动类型是否允许BC添加方法是删除方法否修改方法名否缩小可见性否将方法移动到父类是添加无默认值的参数否添加带默认值的参数否删除参数是仅限末尾参数为参数添加默认值否删除参数的默认值否为参数添加类型提示否删除参数的类型提示否修改参数类型否修改返回类型否public 与 protected 方法的规则完全一致且是整份清单中最严格的部分添加方法本身是安全的前提是你不能同时违反使用侧规则——使用者新增方法不保证 BC 是另一个方向的问题其余涉及签名的一切改动基本都被禁止。删除参数仅限末尾参数意味着只能从参数列表尾部裁剪且删除后剩下的参数语义不能变化——这样才能保证旧调用方式仍然有效。private 方法private 方法与 private 属性同理全部允许添加、删除、改名、增删参数、改默认值、改类型提示、改返回类型全部标记是。因为 private 方法外部永远无法直接调用它的任何变化都不构成对外承诺的破坏。静态方法Static Methods改动类型是否允许BC非静态方法改为静态否静态方法改为非静态否静态与非静态的切换会同时改变调用语法::与-和子类覆写方式因此双向都是红线。常量Constants改动类型是否允许BC添加常量是删除常量否修改常量值是但可能被序列化的对象除外必须记录到 UPGRADE.md与接口常量的规则完全一致修改常量值本身允许但涉及可能被序列化的对象时不允许且必须文档化。仓库中的实践印证BC 规则是如何落地的BC 文档不是纸面口号仓库中的真实历史改动可以逐条印证上面的规则常量迁移必须写进 UPGRADE.md文档规定修改常量值必须记录到 UPGRADE.md。在 framework/UPGRADE.md 中可以找到实例——常量IPV6_ADDRESS_LENGTH与IPV4_ADDRESS_LENGTH从yii\validators\IpValidator移到了yii\helpers\IpHelper并明确提示如果你的应用依赖这些常量请更新代码。这正是常量被移动/删除必须文档化的落地证据。常量更名同样要记录同文件framework/UPGRADE.md记载了YII_PATH更名为YII2_PATH的破坏性改动——涉及名称或命名空间变化的红线通过 UPGRADE.md 向所有用户公告。配置常量的覆写警告第 1093 行提示如果你扩展了yii\base\Security并覆写了任何配置常量升级时必须更新代码。这说明即便添加/覆写类改动在框架侧是绿灯使用侧的敏感点仍会被单独标注。接口稳定性示例yii\base\BootstrapInterfaceframework/base/BootstrapInterface.php自since 2.0起接口签名从未改变——一个自框架诞生起就保持稳定的接口正是接口级 BC 承诺调用接口方法、实现接口方法都保证兼容的长期验证。升级实操把 BC 承诺变成你的升级策略BC 文档最终服务于升级无忧。结合 UPGRADE.md 给出的官方流程落地建议如下用 Composer 约束版本在composer.json中要求yiisoft/yii2: ~2.0.10波浪号约束锁定次版本内更新或使用^2.0。补丁版之间 100% 兼容因此可以放心升级到任意更高的补丁版。分步升级依赖运行composer update yiisoft/yii2 yiisoft/yii2-composer bower-asset/inputmask只更新指定包避免一次升级引入过多不确定变更跨次版本升级时例如 2.0.10 → 2.0.20先通读 UPGRADE.md 中的对应条目升级说明是累积式的跨越多版本需依次阅读每一段。升级后回归测试UPGRADE.md 明确建议升级后检查应用是否仍按预期工作、测试是否全部通过。遵守使用侧红线你的业务代码中凡是覆写框架方法并新增参数、反射访问框架私有成员、在子类新增成员的地方都是 BC 承诺之外的灰色地带应通过 UPGRADE.md 变更日志重点跟踪。小结一张表看懂 Yii 2 的 BC 哲学Yii 2 的 BC 政策可以浓缩为三句话对使用者只读、只调用、正常继承与覆写是绿灯在子类里添加新成员和反射私有成员是红灯。对开发者接口签名与 public/protected 方法的任何签名变化都是红线private 成员自由常量删除与序列化对象值变更被禁止其余值变更必须写进 UPGRADE.md。对版本补丁版2.x.y.Z100% 兼容安全修复除外次版本2.x.Y尽量兼容且例外需文档化主版本2.X.0允许破坏但必须提供完整升级指南。这套规则是 Yii 2 得以在长期维护中保持快速、安全、专业口碑的底层工程纪律。更完整的发布与分支细节可继续阅读 版本管理、发布流程 与英文原版 Backwards Compatibility 文档。赞分享后端Web框架【免费下载链接】yii2Yii 2: The Fast, Secure and Professional PHP Framework项目地址https://gitcode.com/gh_mirrors/yi/yii2点击查看免费下载相关推荐Cursor 插件 context-mode沙箱执行 FTS5 知识库 原生 Hooks 的上下文窗口保护实战指南Cursor 插件 context mode沙箱执行 FTS5 知识库 原生 Hooks 的上下文窗口保护实战指南 context mode 是一个同后端Web框架PostGraphile 版本策略完全指南SemVer、GraphQL Schema 稳定性与插件接口的兼容性承诺PostGraphile 版本策略完全指南SemVer、GraphQL Schema 稳定性与插件接口的兼容性承诺 本篇指南系统讲解 PostGraphile后端API网关PyTorch PR 评审中的向后兼容性BC判定指南从规则到源码实证PyTorch PR 评审中的向后兼容性BC判定指南从规则到源码实证 本篇技术指南基于 PyTorch 仓库内置的 PR 评审技能文档 .claude/s人工智能机器学习深度学习分布式训练模型编译上一篇mold 项目中的 TBB concurrent_hash_map 并发哈希表实战指南从 accessor 读写语义到 HashCompare 定制下一篇如何5分钟快速上手GloomAndroid端GitHub客户端的完整安装指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表