diff --git a/en/10_Contributing/05_Coding_Conventions/01_PHP_Coding_Conventions.md b/en/10_Contributing/05_Coding_Conventions/01_PHP_Coding_Conventions.md index 7ba79b871..c2c96c6bb 100644 --- a/en/10_Contributing/05_Coding_Conventions/01_PHP_Coding_Conventions.md +++ b/en/10_Contributing/05_Coding_Conventions/01_PHP_Coding_Conventions.md @@ -172,3 +172,7 @@ PHPDocs are not only useful when looking at the source code, but are also used i - Prefer the identical `===` operator over the equality `==` operator for comparisons. - If you directly reference a third-party dependency in code, then ensure the dependency is required in the module's `composer.json` file. - Avoid hardcoding values when there is a method available to dynamically get a value, for example use [`DataObjectSchema::tableName()`](api:SilverStripe\ORM\DataObjectSchema::tableName()) to get the table name for a `DataObject` model rather than hard coding it. +- Do not use the `self` keyword, e.g. `self::myMethod()` instead use the short-name of the current class e.g. `MyClass::myMethod()` which is functionally equivalent. This avoids a specific class of bug that is introduced when using late static binding downstream from `self`. + - The one exception to this rule is traits as there is no way to know the class the trait is applied to. + - The use of `static` keyword is perfectly OK and is often appropriate. + - You should probably not use `MyClass::config()` and instead use `static::config()` as that will read any overriden config from subclasses. `self::config()` somewhat unintuitively behaves like `static::config()` and should not be used.