moodlehq / moodle-cs

Moodle Coding Style
https://github.com/moodlehq/moodle-cs
GNU General Public License v3.0
18 stars 16 forks source link

[CONTRIB-8128] Enforce coding guidelines for requiring namespaces for any new PHP files #26

Open sarjona opened 3 years ago

sarjona commented 3 years ago

This is about to enforce the following policy decided recently (https://tracker.moodle.org/browse/MDLSITE-6087).

Policy: Require formal namespaces for any new PHP files Since 19th June 2020, this rule applies:

  1. Formal namespaces are required for any new classes in Moodle. The following exceptions apply:
    1. there is no requirement to move existing non-namespaced classes to a namespace; and
    2. where an existing mechanism exists for loading a class, and that mechanism does not support the use of a namespaced class, the existing pseudo-namespaced prefix on the class name will be allowed.
  2. The use of a pseudo-namespace prefix on classnames is deprecated and should only be used in the above situations.
  3. The use of namespaces must conform to the following rules:
    1. Classes belonging to a namespace must be created in a classes directory inside a plugin (e.g. mod/forum/classes), or for core code, in lib/classes or subsystemdir/classes.
    2. The classname and filename for all namespaced classes must conform to the automatic class loading rules. The use of formal PHP namespaces in all new code is required.

Valid examples:

namespace mod_forum;
class example {
}

namespace mod_forum\external;
class example {
}

namespace core_user;
class example {
}

No longer valid:

class mod_forum_example {
}

class mod_forum_external_invalid {
}

class core_user_example {
}

This issue is about to verify these details in the codechecker. Nothing more, nothing less.


Reporter: Sara Arjona Original issue: https://tracker.moodle.org/browse/CONTRIB-8128

jrchamp commented 1 year ago

This is detected in moodle-extra by PSR1.Classes.ClassDeclaration.MissingNamespace. Unfortunately, Moodle still expects certain classes to exist in the global namespace, such as mod_<modname>_mod_form and the {backup,restore}_<modname>_activity_task classes.