Hello,
For many years, some classes in MediaWiki implemented the IDBAccessObject interface (which only provides several public constants) and then would call them indirectly (e.g. self::READ_NORMAL). Since these constants were public, other parts of MediaWiki started to call them through the implementing class as well (e.g. calling User::READ_LATEST).
This is inconsistent with the access pattern of other constants in MediaWiki. it's also confusing (e.g. it's unclear to a newcomer why UserFactory is implementing IDBAccessObject) and it's prone to clashes (e.g. BagOStuff class has a clashing constant).
Since it's not possible to trigger a deprecation warning in such cases, It can't follow the usual stable interface policy path [1] and here is the email to wikitech-l as required by the policy.
In three weeks we will remove indirect access to these constants by removing IDBAccessObject from implementation. This will take effect from 1.42 release.
Classes that won't have those constants anymore are including but not limited to:
* User
* WikiPage (and its subclasses)
* File (and its subclasses)
* Title
* ActorStore
* RevisionStore
* UserOptionsManager
* And more.
To find such cases in extensions you maintain, you can search for "(?<!IDBAccessObject)::READ_" (regex) and check if the constant being used is an indirect call to IDBAccessObject. Be careful that there might be some false positives such as custom defined constants, constants referring to BagOStuff ones and similar cases like that.
We have already removed all cases in core and extensions deployed to Wikimedia production.
You can follow the work and see examples of how the migration is done in extensions (for example
gerrit:993112) in
T354194.
[1] From
the policy: "If it is not reasonably possible for the deprecated code to emit
deprecation warnings, hard deprecation can be applied by announcing the
removal on wikitech-l in a timely manner."
Thank you and sorry for the inconvenience,