Como ignorar certos erros padrão de codificação no PHP CodeSniffer


14

Temos um aplicativo da web PHP 5 e atualmente estamos avaliando o PHP CodeSniffer para decidir se forçar os padrões de código melhora a qualidade do código sem causar muita dor de cabeça. Se parecer bom, adicionaremos um gancho de pré-confirmação do SVN para garantir que todos os novos arquivos confirmados no ramo dev estejam livres de odores padrão de codificação.

Existe uma maneira de configurar o codeSniffer do PHP para ignorar um tipo específico de erro? ou fazê-lo tratar um determinado erro como um aviso?

Aqui está um exemplo para demonstrar o problema:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div>
    <?php
    echo getTabContent('Programming', 1, $numX, $numY);

    if (isset($msg)) {
        echo $msg;
    }
    ?>
</div>
</body>
</html>

E esta é a saída do PHP_CodeSniffer:

> phpcs test.php 

-------------------------------------------------- ------------------------------
ENCONTRAR 2 ERROS E 1 ADVERTÊNCIA QUE AFETAM 3 LINHAS
-------------------------------------------------- ------------------------------
  1 | ATENÇÃO A linha excede 85 caracteres; contém 121 caracteres
  9 ERRO Comentário de documento de arquivo ausente
 11 ERRO Linha recuada incorretamente; 0 espaços esperados, encontrado 4
-------------------------------------------------- ------------------------------

Estou com um problema com o erro " Linha recuada incorretamente ". Eu acho que isso acontece porque eu estou misturando a indentação PHP com a indentação HTML. Mas isso torna mais legível, não é? ( levando em consideração que não tenho recursos para migrar para uma estrutura MVC no momento ). Então, eu gostaria de ignorá-lo, por favor.


1
esta é uma questão de programação um pouco demais para a IMO estar aqui .. uma vez que trata-se de um utilitário semelhante ao "LINT" que seria principalmente de interesse para programadores hard-core, não necessariamente para webmasters. Mas é bem solicitado e formatado, para que possamos deixar por enquanto.
10138 Jeff Atwood

2
Sobre o aviso da linha 1: posso sugerir o uso do DOCTYPE HTML5?
luiscubal 16/07/10

Obrigado pelo seu feedback Jeff - fico feliz em mudar isso. Eu provavelmente deveria ter percebido quando não havia tag PHP quando criei a pergunta :-).
Tom

@luiscubal - ele, boa sugestão; como o seu pensamento ;-)
Tom

Respostas:


11

Encontrei uma solução para remover o erro " Linha recuada incorretamente ", mas primeiro devo dizer que o dragonmantank tem um ponto excelente - você não deve misturar PHP e HTML. É uma receita para dores de cabeça. No entanto, infelizmente, acho que misturar PHP e HTML é muito comum, especialmente em software legado.

A solução mais rápida e suja, assumindo que estamos usando os phpcspadrões de codificação padrão (que são os padrões PEAR ), é remover o arquivo Sniff relevante. Encontre a localização dos padrões PEAR, para mim, usando o Ubuntu , foi aqui:

> cd /usr/share/php/PHP/CodeSniffer/Standards/PEAR/Sniffs/WhiteSpace

Renomeie o ScopeIndentSniff.phparquivo para que o sniff que verifica a indentação do código não seja mais executado:

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Trabalho feito - agora o recuo não será verificado e o erro " Linha recuada incorretamente " não ocorrerá ( e seu código não será padrão e não será de alta qualidade! ).


A solução acima é bastante amadora - a solução mais limpa é criar um novo padrão de codificação que use todos os padrões do PEAR, exceto suas personalizações escolhidas a dedo. Isso é muito rápido de fazer. Aqui está como fazer isso usando getIncludedSniffs()and getExcludedSniffs()e algumas phpcsconvenções de nomenclatura:

Go to the directory where the phpcs coding standards are defined:
> cd /usr/share/php/PHP/CodeSniffer/Standards

Create a new directory for your new standard:
> sudo mkdir PEARish
> cd PEARish

Create your new standard by saving the following in the file:
> sudo emacs PEARishCodingStandard.php
<?php
class PHP_CodeSniffer_Standards_PEARish_PEARishCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard
{
    public function getIncludedSniffs()
    {
      return array('PEAR');
    }

    public function getExcludedSniffs()
    {
      return array('PEAR/Sniffs/WhiteSpace/ScopeIndentSniff.php');
    }
}
?>

Teste seu novo padrão de codificação personalizado chamando phpcsusando o --standardsinalizador Por exemplo:

> phpcs --standard=PEARish Test.php

Depois de funcionar, você pode definir seu novo padrão como padrão, o que significa que você não precisa digitar o --standardsinalizador sempre que usar phpcs:

> sudo phpcs --config-set default_standard PEARish

Veja o manual do phpcs para mais informações.


Isso foi realmente útil - usei esta resposta para remover erros que aparecem ao longo das linhas de "A classe deve estar em um espaço para nome de pelo menos um nível", juntamente com os erros de nomeação de funções de maiúsculas e minúsculas. Estou usando o PSR2 o máximo que posso, mas, ao editar um site Magento, não estou em condições de passar e renomear todas as funções e resolver o namespacing.
Dave Criança

7

Você encontrará muitos problemas ao executar o PHPCS com seu código PHP misturado com HTML. O PHPCS só é realmente útil quando você analisa scripts PHP puros. Os padrões de codificação embutidos são baseados em PHP puro, e não em PHP / HTML misto.

Uma opção seria criar seu próprio padrão personalizado e usá-lo. O padrão personalizado levaria em conta a mistura de código, mas provavelmente seria difícil escrever.

A outra opção é usar um sistema de modelos, pois você disse que não deseja mudar para uma estrutura. Smarty e Twig podem ser usados ​​fora de uma estrutura MVC. Vá para um desses e faça com que o PHPCS analise apenas os arquivos .PHP, não os arquivos de modelo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.