Skip to content

Backwards Compatibility Guide

Ensuring that you can upgrade your applications easily and smoothly is important to us. That's why we only break compatibility at major release milestones. You might be familiar with semantic versioning, which is the general guideline we use on all CakePHP projects. In short, semantic versioning means that only major releases (such as 2.0, 3.0, 4.0) can break backwards compatibility. Minor releases (such as 2.1, 3.1, 3.2) may introduce new features, but are not allowed to break compatibility. Bug fix releases (such as 2.1.2, 3.0.1) do not add new features, but fix bugs or enhance performance only.

NOTE

Deprecations are removed with the next major version of the framework. It is advised to early on adapt your code already each minor as outlined in the deprecation comments and the migration guides.

To clarify what changes you can expect in each release tier we have more detailed information for developers using CakePHP, and for developers working on CakePHP that helps set expectations of what can be done in minor releases. Major releases can have as many breaking changes as required.

Migration Guides

For each major and minor release, the CakePHP team will provide a migration guide. These guides explain the new features and any breaking changes that are in each release. They can be found in the Appendices section of the cookbook.

Using CakePHP

If you are building your application with CakePHP, the following guidelines explain the stability you can expect.

Interfaces

Outside of major releases, interfaces provided by CakePHP will not have any existing methods changed. New methods may be added, but no existing methods will be changed.

Classes

Classes provided by CakePHP can be constructed and have their public methods and properties used by application code and outside of major releases backwards compatibility is ensured.

NOTE

Some classes in CakePHP are marked with the @internal API doc tag. These classes are not stable and do not have any backwards compatibility promises.

In minor releases, new methods may be added to classes, and existing methods may have new arguments added. Any new arguments will have default values, but if you've overridden methods with a differing signature you may see fatal errors. Methods that have new arguments added will be documented in the migration guide for that release.

The following table outlines several use cases and what compatibility you can expect from CakePHP:

If you...Backwards compatibility?
Typehint against the classYes
Create a new instanceYes
Extend the classYes
Access a public propertyYes
Call a public methodYes
Extend a class and...
Override a public propertyYes
Access a protected propertyNo[^1]
Override a protected propertyNo[^2]
Override a protected methodNo[^3]
Call a protected methodNo[^4]
Add a public propertyNo
Add a public methodNo
Add an argument
to an overridden methodNo[^5]
Add a default argument value
to an existing method
argumentYes

Working on CakePHP

If you are helping make CakePHP even better please keep the following guidelines in mind when adding/changing functionality:

In a minor release you can:

In a minor release can you...
Classes
Remove a classNo
Remove an interfaceNo
Remove a traitNo
Make finalNo
Make abstractNo
Change nameYes[^6]
Properties
Add a public propertyYes
Remove a public propertyNo
Add a protected propertyYes
Remove a protected propertyYes[^7]
Methods
Add a public methodYes
Remove a public methodNo
Add a protected methodYes
Move to parent classYes
Remove a protected methodYes[^8]
Reduce visibilityNo
Change method nameYes[^9]
Add a new argument with
default valueYes
Add a new required argument
to an existing method.No
Remove a default value from
an existing argumentNo
Change method type voidYes

Deprecations

In each minor release, features may be deprecated. If features are deprecated, API documentation and runtime warnings will be added. Runtime errors help you locate code that needs to be updated before it breaks. If you wish to disable runtime warnings you can do so using the Error.errorLevel configuration value:

text
// in config/app.php
// ...
'Error' => [
    'errorLevel' => E_ALL ^ E_USER_DEPRECATED,
]
// ...

Will disable runtime deprecation warnings.

[^1]: Your code may be broken by minor releases. Check the migration guide for details.

[^2]: Your code may be broken by minor releases. Check the migration guide for details.

[^3]: Your code may be broken by minor releases. Check the migration guide for details.

[^4]: Your code may be broken by minor releases. Check the migration guide for details.

[^5]: Your code may be broken by minor releases. Check the migration guide for details.

[^6]: You can change a class/method name as long as the old name remains available. This is generally avoided unless renaming has significant benefit.

[^7]: Avoid whenever possible. Any removals need to be documented in the migration guide.

[^8]: Avoid whenever possible. Any removals need to be documented in the migration guide.

[^9]: You can change a class/method name as long as the old name remains available. This is generally avoided unless renaming has significant benefit.

Released under the MIT License.