Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. ForbiddenPublicPropertySniff.php

class ForbiddenPublicPropertySniff

Hierarchy

  • class \SlevomatCodingStandard\Sniffs\Classes\ForbiddenPublicPropertySniff implements \PHP_CodeSniffer\Sniffs\Sniff

Expanded class hierarchy of ForbiddenPublicPropertySniff

File

vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ForbiddenPublicPropertySniff.php, line 18

Namespace

SlevomatCodingStandard\Sniffs\Classes
View source
final class ForbiddenPublicPropertySniff implements Sniff {
    public const CODE_FORBIDDEN_PUBLIC_PROPERTY = 'ForbiddenPublicProperty';
    
    /** @var bool */
    public $checkPromoted = false;
    
    /**
     * @return array<int, (int|string)>
     */
    public function register() : array {
        return [
            T_VARIABLE,
        ];
    }
    
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
     * @param int $variablePointer
     */
    public function process(File $file, $variablePointer) : void {
        if (!PropertyHelper::isProperty($file, $variablePointer, $this->checkPromoted)) {
            return;
        }
        // skip Sniff classes, they have public properties for configuration (unfortunately)
        if ($this->isSniffClass($file, $variablePointer)) {
            return;
        }
        $scopeModifierToken = $this->getPropertyScopeModifier($file, $variablePointer);
        if ($scopeModifierToken['code'] === T_PROTECTED || $scopeModifierToken['code'] === T_PRIVATE) {
            return;
        }
        $errorMessage = 'Do not use public properties. Use method access instead.';
        $file->addError($errorMessage, $variablePointer, self::CODE_FORBIDDEN_PUBLIC_PROPERTY);
    }
    private function isSniffClass(File $file, int $position) : bool {
        $classTokenPosition = ClassHelper::getClassPointer($file, $position);
        $classNameToken = ClassHelper::getName($file, $classTokenPosition);
        return StringHelper::endsWith($classNameToken, 'Sniff');
    }
    
    /**
     * @phpcsSuppress SlevomatCodingStandard.TypeHints.DisallowMixedTypeHint.DisallowedMixedTypeHint
     * @return array{code: int|string}
     */
    private function getPropertyScopeModifier(File $file, int $position) : array {
        $scopeModifierPosition = TokenHelper::findPrevious($file, array_merge([
            T_VAR,
        ], Tokens::$scopeModifiers), $position - 1);
        return $file->getTokens()[$scopeModifierPosition];
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title
ForbiddenPublicPropertySniff::$checkPromoted public property @var bool
ForbiddenPublicPropertySniff::CODE_FORBIDDEN_PUBLIC_PROPERTY public constant
ForbiddenPublicPropertySniff::getPropertyScopeModifier private function * @phpcsSuppress SlevomatCodingStandard.TypeHints.DisallowMixedTypeHint.DisallowedMixedTypeHint
*
ForbiddenPublicPropertySniff::isSniffClass private function
ForbiddenPublicPropertySniff::process public function * @phpcsSuppress SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingNativeTypeHint
*
Overrides Sniff::process
ForbiddenPublicPropertySniff::register public function * Overrides Sniff::register

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal