首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >phpcs:如何执行类继承?

phpcs:如何执行类继承?
EN

Stack Overflow用户
提问于 2022-04-19 15:30:39
回答 1查看 68关注 0票数 0

我想确保某些dir (src/Controller/CP)中的所有类都扩展了其他类AbstractCPController

所以

代码语言:javascript
复制
class SupportTicketTagController extends AbstractController

将显示PHPCS错误,以及

代码语言:javascript
复制
class SupportTicketTagController extends AbstractCPController

会很好的。

有可能用PHPCS吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-21 08:43:35

最后我创造了我自己的嗅觉。它远非十全十美,但可能成为未来某个人的基础:

代码语言:javascript
复制
<?php

declare(strict_types=1);

namespace MyCodingStandard\Sniffs\Classes;

use PHP_CodeSniffer\Fixer;
use PHP_CodeSniffer\Sniffs\Sniff;
use PHP_CodeSniffer\Files\File;

/**
 * Sniff for catching classes not marked as abstract or final
 */
final class ClassInheritanceSniff implements Sniff
{
    private ?Fixer $fixer;

    private $position;

    public function register(): array
    {
        return [T_CLASS];
    }

    public function process(File $file, $position): void
    {
        $this->fixer = $file->fixer;
        $this->position = $position;

        $tokens = $file->getTokens();

        $className = $tokens[$file->findNext(T_STRING, $position + 1)]['content'];

        if ($className === 'AbstractCPController') {
            return;
        }

        $curlyOpenLine = $file->findNext(T_OPEN_CURLY_BRACKET, $position + 1);

        $extendsLine = $file->findNext(T_EXTENDS, $position + 1, $curlyOpenLine - 1);
        $implementsLine = $file->findNext(T_IMPLEMENTS, $position + 1, $curlyOpenLine - 1);

        $extendedClasses = [];
        $implementedInterfaces = [];

        if ($extendsLine) {
            $extendsLineMax = $curlyOpenLine - 1;

            if ($implementsLine > $extendsLine) {
                $extendsLineMax = $implementsLine - 1;
            }

            $lastClassName = '';

            for ($i = $extendsLine + 1; $i < $extendsLineMax; $i++) {
                if ($tokens[$i]['code'] == T_STRING || $tokens[$i]['code'] == T_NS_SEPARATOR) {
                    $lastClassName .= $tokens[$i]['content'];
                } else {
                    if ($lastClassName) {
                        $extendedClasses[] = $lastClassName;
                        $lastClassName = '';
                    }
                }
            }

            if ($lastClassName) {
                $extendedClasses[] = $lastClassName;
            }
        }

        if ($implementsLine) {
            $implementsLineMax = $curlyOpenLine - 1;

            if ($extendsLine > $implementsLine) {
                $implementsLineMax = $extendsLine - 1;
            }

            $lastClassName = '';

            for ($i = $implementsLine + 1; $i < $implementsLineMax; $i++) {
                if ($tokens[$i]['code'] == T_STRING || $tokens[$i]['code'] == T_NS_SEPARATOR) {
                    $lastClassName .= $tokens[$i]['content'];
                } else {
                    if ($lastClassName) {
                        $implementedInterfaces[] = $lastClassName;
                        $lastClassName = '';
                    }
                }
            }

            if ($lastClassName) {
                $implementedInterfaces[] = $lastClassName;
            }
        }

        foreach ($extendedClasses as $class) {
            if (str_ends_with($class, 'AbstractCPController')) {
                return;
            }
        }

        $file->addError(
            'All CP Controller classes should extend from AbstractCPController',
            $position - 1,
            self::class
        );
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71927526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档