我们向后兼容的承诺

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

我们向后兼容的承诺

确保您的项目顺利升级是我们的首要任务。这就是为什么我们向您承诺所有小型Symfony发行版的向后兼容性(BC)。ob娱乐下载你可能认为这个策略是语义版本控制.简而言之,语义版本控制意味着只有主要版本(如2.0、3.0等)才允许打破向后兼容性。小版本(如2.5、2.6等)可能会引入新特性,但必须在不破坏该版本分支现有API的情况下这样做。X在前面的例子)。

谨慎

这个承诺是在Symfony 2.3中引入的,但不适用于以前的Symob娱乐下载fony版本。

然而,向后兼容性有许多不同的形式。事实上,我们对框架所做的几乎每一个更改都有可能破坏应用程序。例如,如果我们向一个类中添加了一个新方法,这将破坏扩展了这个类并添加了相同方法,但方法签名不同的应用程序。

另外,并不是每个BC中断对应用程序代码都有相同的影响。虽然一些BC中断要求您对类或体系结构进行重大更改,但其他中断则像更改方法名称一样容易修复。

这就是我们为您创建这个页面的原因。“使用Symfony Code”一节将ob娱乐下载告诉您如何确保您的应用程序在升级到同一主要发布分支的新版本时不会完全崩溃。

第二部分,“Symfony代码”,针对Symfony贡献者。ob娱乐下载本节列出了每个贡献者都需要遵守的详细规则,以确保我们的用户顺利升级。

使用Symfob娱乐下载ony代码

如果您在项目中使用Symfony,ob娱乐下载下面的指导方针将帮助您确保顺利升级到您的Symfony版本的所有后续小版本。

使用我们的界面

Symfony附带的所有接口都可以在类型提示中使用。ob娱乐下载您还可以调用它们声明的任何方法。我们保证不会破坏遵守这些规则的代码。

谨慎

该规则的例外是带有@internal.不应该使用或实现这样的接口。

如果你想实现一个接口,你首先应该确保这个接口是一个API接口。方法可以识别API接口@api标记在它们的源代码中:

1 2 3 4 5 6 7 8 9 10 11
HttpKernelInterface处理请求并将其转换为响应。* *@authorFabien Potencier < Fabien@ob娱乐下载symfony.com> * *@api* /接口HttpKernelInterface/ /……

如果你实现了一个API接口,我们保证永远不会破坏你的代码。相比之下,常规接口可以在小版本之间进行扩展,例如添加一个新方法。如果实现常规接口,请准备手动升级代码。

请注意

即使我们所做的更改需要手动升级,我们也将自己限制在可以轻松升级的更改上。我们将始终在Symfony根目录的upgrade文件中记录准确的升级说明。ob娱乐下载

下表详细解释了我们的向后兼容性承诺所涵盖的用例:

用例 常规的 API
如果你…… 那么我们保证BC…
在接口上键入提示 是的 是的
调用一个方法 是的 是的
如果你实现接口并且… 那么我们保证BC…
实现一个方法 没有[1]_ 是的
向已实现的方法添加参数 没有[1]_ 是的
为参数添加默认值 是的 是的

请注意

如果你认为我们的常规课程应该有一个@api标签,把你的请求变成GitHub上的新门票.然后,我们将评估是否可以添加标记。

使用我们的课程

Symfony提供的所有类都可以通过它们的公共方ob娱乐下载法和属性进行实例化和访问。

谨慎

包含标记的类、属性和方法@internal以及各个类所处的位置\测试名称空间是这个规则的一个例外。它们仅供内部使用,不应由您自己的代码访问。

就像接口一样,我们也区分常规类和API类。与API接口一样,API类也用@api标签:

1 2 3 4 5 6 7 8 9 10 11
/** * Request表示HTTP请求。* *@authorFabien Potencier < Fabien@ob娱乐下载symfony.com> * *@api* /请求/ /……

常规类和API类的区别在于,如果你扩展一个API类并覆盖它的方法,我们可以保证完全向后兼容。我们不能给常规类同样的承诺,因为我们可以,例如,添加一个可选参数到一个方法。因此,被重写方法的签名将不再匹配,并生成致命错误。

请注意

与接口一样,我们将自己限制在可以轻松升级的更改上。我们将在Symfony根目录的upgrade文件中记录准确的升级说明。ob娱乐下载

类标记了特定的属性和方法@api标签,即使他们的班级不是。在这些情况下,我们保证对带标签的属性和方法完全向后兼容(如下面“API”一栏所示),但对类的其余部分则不能。

为了安全起见,请检查下表,以了解我们的向后兼容性承诺涵盖哪些用例:

用例 常规的 API
如果你…… 那么我们保证BC…
在类上键入提示 是的 是的
创建一个新实例 是的 是的
扩展类 是的 是的
进入公共场所 是的 是的
调用一个公共方法 是的 是的
如果您扩展类并…… 那么我们保证BC…
访问受保护的属性 没有[1]_ 是的
调用受保护的方法 没有[1]_ 是的
重写公共属性 是的 是的
重写受保护的属性 没有[1]_ 是的
重写一个公共方法 没有[1]_ 是的
重写受保护的方法 没有[1]_ 是的
添加一个新属性 没有 没有
添加一个新方法 没有 没有
向重写的方法添加参数 没有[1]_ 是的
为参数添加默认值 是的 是的
调用一个私有方法(通过反射) 没有 没有
访问私有属性(通过反射) 没有 没有

请注意

如果你认为我们的常规课程应该有一个@api标签,把你的请求变成GitHub上的新门票.然后,我们将评估是否可以添加标记。

正在Symfony Cob娱乐下载ode中工作

你想帮我们改进Symfony吗?ob娱乐下载太好了!但是,请遵守以下列出的规则,以确保我们的用户顺利升级。

更改接口

下表告诉你在Symfony的接口上可以做哪些修改:ob娱乐下载

变化类型 常规的 API
完全删除 没有 没有
更改名称或命名空间 没有 没有
添加父接口 是的[2]_ 是的[3]_
删除父接口 没有 没有
方法
添加方法 是的[2]_ 没有
删除方法 没有 没有
改变名字 没有 没有
移动到父接口 是的 是的
添加没有默认值的参数 没有 没有
使用默认值添加参数 是的[2]_ 没有
删除参数 是的[4]_ 是的[4]_
为参数添加默认值 是的[2]_ 没有
删除参数的默认值 没有 没有
为参数添加类型提示 没有 没有
删除参数的类型提示 是的[2]_ 没有
改变参数类型 是[2]_ [5]_ 没有
更改返回类型 是[2]_ [6]_ 没有

改变类

下表告诉你在Symfony的类上可以做哪些修改:ob娱乐下载

变化类型 常规的 API
完全删除 没有 没有
做最后 没有 没有
使抽象的 没有 没有
更改名称或命名空间 没有 没有
更改父类 是的[7]_ 是的[7]_
添加接口 是的 是的
删除接口 没有 没有
公共属性
添加公共属性 是的 是的
移走公共财产 没有 没有
降低能见度 没有 没有
移动到父类 是的 是的
受保护的属性
添加受保护属性 是的 是的
移除受保护的属性 是的[2]_ 没有
降低能见度 是的[2]_ 没有
移动到父类 是的 是的
私有财产
添加私有属性 是的 是的
移走私人财产 是的 是的
构造函数
添加不带强制参数的构造函数 是的[2]_ 是的[2]_
删除构造函数 是的[2]_ 没有
降低公共构造函数的可见性 没有 没有
降低受保护构造函数的可见性 是的[2]_ 没有
移动到父类 是的 是的
公共方法
添加公共方法 是的 是的
移除公共方法 没有 没有
改变名字 没有 没有
降低能见度 没有 没有
移动到父类 是的 是的
添加没有默认值的参数 没有 没有
使用默认值添加参数 是的[2]_ 没有
删除参数 是的[4]_ 是的[4]_
为参数添加默认值 是的[2]_ 没有
删除参数的默认值 没有 没有
为参数添加类型提示 是的[8]_ 没有
删除参数的类型提示 是的[2]_ 没有
改变参数类型 是[2]_ [5]_ 没有
更改返回类型 是[2]_ [6]_ 没有
受保护的方法
添加受保护方法 是的 是的
移除受保护方法 是的[2]_ 没有
改变名字 没有 没有
降低能见度 是的[2]_ 没有
移动到父类 是的 是的
添加没有默认值的参数 是的[2]_ 没有
使用默认值添加参数 是的[2]_ 没有
删除参数 是的[4]_ 是的[4]_
为参数添加默认值 是的[2]_ 没有
删除参数的默认值 是的[2]_ 没有
为参数添加类型提示 是的[2]_ 没有
删除参数的类型提示 是的[2]_ 没有
改变参数类型 是[2]_ [5]_ 没有
更改返回类型 是[2]_ [6]_ 没有
私有方法
添加私有方法 是的 是的
删除私有方法 是的 是的
改变名字 是的 是的
降低能见度 是的 是的
添加没有默认值的参数 是的 是的
使用默认值添加参数 是的 是的
删除参数 是的 是的
为参数添加默认值 是的 是的
删除参数的默认值 是的 是的
为参数添加类型提示 是的 是的
删除参数的类型提示 是的 是的
改变参数类型 是的 是的
更改返回类型 是的 是的
静态方法
把非静态变成静态 没有 没有
把静态变为非静态 没有 没有
..您的代码可能被Symfony代码中的更改破坏。ob娱乐下载这样的改变将会
但是要记录在UPGRADE文件中。
..[2]应该避免。完成后,此更改必须记录在
升级文件。
..[3]添加的父接口不能引入任何新方法
已经存在于接口中。
..只有方法的最后一个参数可以被删除,而PHP不会这样做
关心传递给方法的附加参数。
..参数类型只能更改为兼容的或不太特定的类型

类型。允许以下类型更改:

原始类型 新型
布尔 任何标量类型与等效布尔值
字符串 任何标量类型或具有等效的对象字符串值
整数 任何标量类型与等效整型值
浮动 任何标量类型与等效浮点值
< C > 的任何超类或接口< C >
接口<我> 的任何超界面<我>
..返回类型只能更改为兼容的或更特定的类型

类型。允许以下类型更改:

原始类型 新型
布尔 任何标量类型与等效布尔值
字符串 任何标量类型或具有等效的对象字符串值
整数 任何标量类型与等效整型值
浮动 任何标量类型与等效浮点值
数组 的实例ArrayAccess可否认的而且可数名词
ArrayAccess 数组
可否认的 数组
可数名词 数组
< C > 的任何子类< C >
接口<我> 的任何子接口或实现类<我>
..当改变父类时,原来的父类必须保持为
类的祖先。
..类型提示只能在传递不同类型的值时添加
先前生成的致命错误。
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。