我们承诺的向后兼容性
编辑该页面我们承诺的向后兼容性
确保顺利升级您的项目是我们的首要任务。这就是为什么我们向你保证向后兼容(BC)为所有小Symfony版本。ob娱乐下载你可能认识这个策略语义版本控制。简而言之,语义版本控制意味着只有主要版本(如5.0、6.0等)可以打破向后兼容性。小版本(如5.1、5.2等)可能会引入新功能,但必须这样做,而不会破坏现有的API的发布分支(5。x在前面的例子)。
我们还提供弃用消息触发迁移过程的代码库来帮助你在主要版本。
然而,有许多不同口味的向后兼容性。事实上,几乎每一个变化,我们让应用程序框架可以打破。例如,如果我们添加一个新的方法来一个类,这将打破一个应用程序扩展这个类并添加相同的方法,但用不同的方法签名。
而且,并不是每一个公元前打破对应用程序代码有相同的影响。虽然一些公元前休息需要你做出重大改变你的类或结构,其他人都是固定的,改变一个方法的名称。
这就是为什么我们创建这个页面。“使用Symfony的代码”一节将告诉ob娱乐下载你如何确保应用程序不会打破完全升级到新版本时相同的主要发布分支。
第二部分,“在Symfony的代码”,是针对Symfony的贡献ob娱乐下载者。本节列出了详细的规则,每个贡献者需要遵循以确保顺利升级为我们的用户。
使用Symfob娱乐下载ony的代码
如果你使用Symfony项目,下面ob娱乐下载的指南将帮助你确保所有未来的小版本升级你的Symfony的版本。
使用我们的接口
附带Symfony可用于所有接口类型提示。ob娱乐下载你也可以调用任何方法的声明。我们保证我们不会打破坚持这些规则的代码。
谨慎
这个规则的例外是接口标记@internal
。不应使用这种接口或实现。
如果你实现一个接口,我们保证我们不会打破你的代码。
下表详细解释用例是由我们的向后兼容性承诺:
用例 | 向后兼容性 |
---|---|
如果你…… | 然后我们保证公元前… |
类型提示界面 | 是的 |
调用一个方法 | 是的[10] |
如果你实现接口和… | 然后我们保证公元前… |
实现一个方法 | 是的 |
添加一个参数的实现方法 | 是的 |
添加一个参数的默认值 | 是的 |
添加一个返回类型的方法实现 | 是的 |
使用我们的类
Symfony提供的所有类可以实例化并通过其公共ob娱乐下载访问的方法和属性。
谨慎
类、属性和方法,标签@internal
以及位于不同的类* \ \测试
名称空间是一个例外。他们是仅供内部使用,不应由您自己的代码访问。
安全起见,检查下面的表,知道哪些用例是由我们的向后兼容性承诺:
用我们的品质
Symfony提供的所有特征可以使用在你的类。ob娱乐下载
谨慎
这个规则的例外是特征标记@internal
。这样的特质不应使用。
安全起见,检查下面的表,知道哪些用例是由我们的向后兼容性承诺:
用例 | 向后兼容性 |
---|---|
如果你…… | 然后我们保证公元前… |
使用一个特征 | 是的 |
如果你使用特征和… | 然后我们保证公元前… |
用它来实现一个接口 | 是的 |
用它来实现一个抽象方法 | 是的 |
用它来扩展一个父类 | 是的 |
使用它来定义一个抽象类 | 是的 |
使用一个公共、保护或私有财产 | 是的 |
使用一个公共、保护或私有方法 | 是的 |
在Symfony的代码ob娱乐下载
你想帮助我们提高Symfony ?ob娱乐下载太好了!然而,请遵守下列规则,以确保顺利升级为我们的用户。
更改接口
这个表告诉你哪些变化时你可以做的工作在Symfony的接口:ob娱乐下载
改变类
这个表告诉你改变你可以当工作在Symfony的类:ob娱乐下载
类型的变化 | 改变允许 | 笔记 |
---|---|---|
完全删除 | 没有 | |
做最后 | 没有 | [6] |
使抽象的 | 没有 | |
更改名称或命名空间 | 没有 | |
改变父类 | 是的 | [4] |
添加接口 | 是的 | |
删除接口 | 没有 | |
公共属性 | ||
添加公共属性 | 是的 | |
删除公共财产 | 没有 | |
降低能见度 | 没有 | |
转到父类 | 是的 | |
受保护的属性 | ||
添加保护属性 | 是的 | |
删除受保护的属性 | 没有 | [7] |
降低能见度 | 没有 | [7] |
张扬 | 没有 | [7] |
转到父类 | 是的 | |
私有财产 | ||
添加私有财产 | 是的 | |
张扬或保护 | 是的 | |
删除私人财产 | 是的 | |
构造函数 | ||
添加构造函数没有强制参数 | 是的 | [1] |
删除构造函数 | 没有 | |
减少公共构造函数的可见性 | 没有 | |
减少一个受保护的构造函数的可见性 | 没有 | [7] |
转到父类 | 是的 | |
析构函数 | ||
添加析构函数 | 是的 | |
把析构函数 | 没有 | |
转到父类 | 是的 | |
公共方法 | ||
添加公共方法 | 是的 | |
删除公共方法 | 没有 | |
改变名字 | 没有 | |
降低能见度 | 没有 | |
做最后 | 没有 | [6] |
转到父类 | 是的 | |
添加参数没有默认值 | 没有 | |
添加参数的默认值 | 没有 | [7][8] |
删除参数 | 没有 | [3] |
添加默认值的参数 | 没有 | [7][8] |
删除默认值的参数 | 没有 | |
添加类型提示一个论点 | 没有 | [7][8] |
删除类型的一个论点 | 没有 | [7][8] |
改变参数类型 | 没有 | [7][8] |
添加返回类型 | 没有 | [7][8] |
删除返回类型 | 没有 | [7][8][9] |
改变返回类型 | 没有 | [7][8] |
受保护的方法 | ||
添加保护方法 | 是的 | |
删除受保护的方法 | 没有 | [7] |
改变名字 | 没有 | [7] |
降低能见度 | 没有 | [7] |
做最后 | 没有 | [6] |
张扬 | 没有 | [7][8] |
转到父类 | 是的 | |
添加参数没有默认值 | 没有 | |
添加参数的默认值 | 没有 | [7][8] |
删除参数 | 没有 | [3] |
添加默认值的参数 | 没有 | [7][8] |
删除默认值的参数 | 没有 | [7] |
添加类型提示一个论点 | 没有 | [7][8] |
删除类型的一个论点 | 没有 | [7][8] |
改变参数类型 | 没有 | [7][8] |
添加返回类型 | 没有 | [7][8] |
删除返回类型 | 没有 | [7][8][9] |
改变返回类型 | 没有 | [7][8] |
私有方法 | ||
添加私有方法 | 是的 | |
去除私有方法 | 是的 | |
改变名字 | 是的 | |
张扬或保护 | 是的 | |
添加参数没有默认值 | 是的 | |
添加参数的默认值 | 是的 | |
删除参数 | 是的 | |
添加默认值的参数 | 是的 | |
删除默认值的参数 | 是的 | |
添加类型提示一个论点 | 是的 | |
删除类型的一个论点 | 是的 | |
改变参数类型 | 是的 | |
添加返回类型 | 是的 | |
删除返回类型 | 是的 | |
改变返回类型 | 是的 | |
静态方法和属性 | ||
非静态变成静态的 | 没有 | [7][8] |
将静态转变为非静态的 | 没有 | |
常量 | ||
添加常数 | 是的 | |
删除常数 | 没有 | |
改变一个常数的价值 | 是的 | [1][5] |
变化的特征
这个表告诉你哪些变化时你可以做的工作在Symfony的特征:ob娱乐下载
类型的变化 | 改变允许 | 笔记 |
---|---|---|
完全删除 | 没有 | |
更改名称或命名空间 | 没有 | |
使用另一个特质 | 是的 | |
公共属性 | ||
添加公共属性 | 是的 | |
删除公共财产 | 没有 | |
降低能见度 | 没有 | |
搬到一个使用特征 | 是的 | |
受保护的属性 | ||
添加保护属性 | 是的 | |
删除受保护的属性 | 没有 | |
降低能见度 | 没有 | |
张扬 | 没有 | |
搬到一个使用特征 | 是的 | |
私有财产 | ||
添加私有财产 | 是的 | |
删除私人财产 | 没有 | |
张扬或保护 | 是的 | |
搬到一个使用特征 | 是的 | |
构造函数和析构函数 | ||
有构造函数和析构函数 | 没有 | |
公共方法 | ||
添加公共方法 | 是的 | |
删除公共方法 | 没有 | |
改变名字 | 没有 | |
降低能见度 | 没有 | |
做最后 | 没有 | [6] |
搬到使用特征 | 是的 | |
添加参数没有默认值 | 没有 | |
添加参数的默认值 | 没有 | |
删除参数 | 没有 | |
添加默认值的参数 | 没有 | |
删除默认值的参数 | 没有 | |
添加类型提示一个论点 | 没有 | |
删除类型的一个论点 | 没有 | |
改变参数类型 | 没有 | |
改变返回类型 | 没有 | |
受保护的方法 | ||
添加保护方法 | 是的 | |
删除受保护的方法 | 没有 | |
改变名字 | 没有 | |
降低能见度 | 没有 | |
做最后 | 没有 | [6] |
张扬 | 没有 | [8] |
搬到使用特征 | 是的 | |
添加参数没有默认值 | 没有 | |
添加参数的默认值 | 没有 | |
删除参数 | 没有 | |
添加默认值的参数 | 没有 | |
删除默认值的参数 | 没有 | |
添加类型提示一个论点 | 没有 | |
删除类型的一个论点 | 没有 | |
改变参数类型 | 没有 | |
改变返回类型 | 没有 | |
私有方法 | ||
添加私有方法 | 是的 | |
去除私有方法 | 没有 | |
改变名字 | 没有 | |
张扬或保护 | 是的 | |
搬到使用特征 | 是的 | |
添加参数没有默认值 | 没有 | |
添加参数的默认值 | 没有 | |
删除参数 | 没有 | |
添加默认值的参数 | 没有 | |
删除默认值的参数 | 没有 | |
添加类型提示一个论点 | 没有 | |
删除类型的一个论点 | 没有 | |
改变参数类型 | 没有 | |
添加返回类型 | 没有 | |
删除返回类型 | 没有 | |
改变返回类型 | 没有 | |
静态方法和属性 | ||
非静态变成静态的 | 没有 | |
将静态转变为非静态的 | 没有 |
笔记
[1]应该避免。当完成时,这种变化必须记录在升级文件。
[2]添加父接口必须不引入任何新方法,接口中不存在了。
[3]只有最后一个可选参数(s)的一个方法可能会被删除,因为PHP不关心附加参数传递给方法。
[4]改变父类时,原始类的父类必须是一个祖先。
[5]常数的值可能只是改变时使用的常量不配置(例如Yaml和XML文件),因为这些不支持常量和硬编码的值。例如,事件名称常量不能改变值没有引入BC打破。此外,如果一个常数可能会用于序列化的对象,一个常数的价值不应改变。
[6]允许使用@final
注释。
[7]如果类是终局的。类,收到了@final
注释后第一个版本被认为是最终在他们的下一个主要版本。只改变一个参数类型是可能的父类型。改变一个返回类型是唯一可能的子类型。
[8]如果方法是终局的。方法,收到了@final
注释后第一个版本被认为是最终在他们的下一个主要版本。只改变一个参数类型是可能的父类型。改变一个返回类型是唯一可能的子类型。
[9]允许无效
返回类型。
[10]参数名称只是兼容性保证覆盖的属性类的构造函数。使用PHP代码命名参数可能会打破当升级到新的Symfony的版本。ob娱乐下载
修改代码向后兼容的
当你阅读上面,很多变化是不被允许的,因为他们代表着落后compability休息。然而,我们希望能够提高代码及其特性随着时间的推移,可以由于一些策略允许还做一些不允许的变化几个步骤确保向后compability和平滑升级路径。有些是在下一节中描述。
将一个参数添加到一个公共方法
一个公共方法添加一个新的参数是可能只有这是最后一个参数的方法。
如果是这样的话,这是如何正确地做小版本:
添加参数作为评论的签名:
1 2 3 4 5 6 7 8 9
/ /新的论点可以是可选的公共函数说(字符串美元文本,/ * bool stripWithespace美元= true * /):无效{}/ /或要求公共函数说(字符串美元文本,/ * bool stripWithespace美元* /):无效{}
文档的新论点PHPDoc:
1 2 3
/ * * *@parambool stripWithespace * /美元
使用
func_num_args
和func_get_arg
检索参数的方法:1
美元stripWithespace=2< = \ func_num_args () ?func_get_arg (1):假;
注意,默认值是
假
保持当前的行为。如果参数有默认值,改变当前的行为,提醒用户:
1
trigger_deprecation (sob娱乐下载ymfony /组件的,“X.Y”,“不通过“bool stripWithespace美元”的论点明确弃用,其默认值将改变Z.0 X”。);
如果参数没有默认值,提醒用户需要的下一个主要版本:
1 2 3 4 5 6 7
如果(\ func_num_args () <2){trigger_deprecation (sob娱乐下载ymfony /组件的,“X.Y”,”“% s”()方法将有一个新的“bool stripWithespace美元”的论点在Z.0版本中,没有定义它是弃用。,__METHOD__);美元stripWithespace=假;}其他的{美元stripWithespace= func_get_arg (1);}
- 的下一个主要版本(
X.0
),取消争论,移除PHPDoc如果没有需要一个描述,并删除func_get_arg
代码和警告。