Cómo ignorar ciertos errores estándar de codificación en PHP CodeSniffer

14

Tenemos una aplicación web PHP 5 y actualmente estamos evaluando PHP CodeSniffer para decidir si forzar estándares de código mejora la calidad del código sin causar demasiado dolor de cabeza. Si parece bueno, agregaremos un enlace de confirmación previa SVN para garantizar que todos los archivos nuevos confirmados en la rama de desarrollo estén libres de olores de codificación estándar.

¿Hay alguna manera de configurar PHP codeSniffer para ignorar un tipo particular de error? o conseguir que trate un cierto error como una advertencia en su lugar?

Aquí un ejemplo para demostrar el 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>

Y esta es la salida de PHP_CodeSniffer:

> phpcs test.php 

-------------------------------------------------- ------------------------------
ENCONTRÓ 2 ERROR (S) Y 1 ADVERTENCIA (S) QUE AFECTAN A 3 LÍNEA (S)
-------------------------------------------------- ------------------------------
  1 | ADVERTENCIA | La línea excede los 85 caracteres; contiene 121 caracteres
  9 | ERROR | Falta el comentario del documento
 11 | ERROR | Línea sangrada incorrectamente; esperado 0 espacios, encontrado 4
-------------------------------------------------- ------------------------------

Tengo un problema con el error " Línea sangrada incorrectamente ". Supongo que sucede porque estoy mezclando la sangría de PHP con la sangría de HTML. Pero esto lo hace más legible, ¿no? ( teniendo en cuenta que no tengo los recursos para moverme a un marco MVC en este momento ). Así que me gustaría ignorarlo por favor.

Tom
fuente
1
Esta es una pregunta de programación demasiado IMO para estar aquí ... ya que se trata de una utilidad similar a "LINT" que sería de gran interés para los programadores de núcleo duro, no necesariamente para webmasters. Pero está bien pedido y formateado, por lo que podemos dejarlo por ahora.
Jeff Atwood
2
Acerca de la advertencia de la línea 1: ¿Puedo sugerirle usar el DOCTYPE HTML5?
luiscubal
Gracias por sus comentarios, Jeff. Estoy feliz de moverlo. Probablemente debería haberme dado cuenta cuando no había una etiqueta PHP cuando creé la pregunta :-).
Tom
@luiscubal - él, buena sugerencia; como tu pensamiento ;-)
Tom

Respuestas:

11

Encontré una solución para eliminar el error " Línea indentada incorrectamente ", pero primero debo decir que dragonmantank tiene un punto excelente: no debes mezclar PHP y HTML. Es una receta para dolores de cabeza. Sin embargo, desafortunadamente creo que mezclar PHP y HTML es muy común, especialmente en el software heredado.

La solución más rápida y sucia asumiendo que estamos usando los phpcsestándares de codificación predeterminados (que son los estándares PEAR ) es eliminar el archivo Sniff relevante. Encuentra la ubicación de los estándares PEAR, para mí, usando Ubuntu , fue aquí:

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

Cambie el nombre del ScopeIndentSniff.phparchivo para que el olfateo que verifica la sangría del código ya no se ejecute:

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Trabajo realizado : ahora no se comprobará la sangría y no se producirá el error " Línea sangrada incorrectamente " (¡ y su código no será estándar y no será de tan alta calidad! ).


La solución anterior es bastante aficionada: la solución más limpia es crear un nuevo estándar de codificación que utilice todos los estándares PEAR, excepto las personalizaciones seleccionadas. Esto es muy rápido de hacer. Aquí le mostramos cómo hacerlo utilizando getIncludedSniffs()y getExcludedSniffs()y algunas phpcsconvenciones 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');
    }
}
?>

Pruebe su nuevo estándar de codificación personalizado invocando phpcsusando la --standardbandera. Por ejemplo:

> phpcs --standard=PEARish Test.php

Una vez que esté funcionando, puede establecer su nuevo estándar como predeterminado, lo que significa que no necesita escribir el --standardindicador cada vez que use phpcs:

> sudo phpcs --config-set default_standard PEARish

Consulte el manual de phpcs para obtener más información.

Tom
fuente
Esto fue realmente útil: utilicé esta respuesta para eliminar los errores que aparecen en la línea de "La clase debe estar en un espacio de nombres de al menos un nivel" junto con los errores de nomenclatura de funciones de casos de camellos. Estoy usando PSR2 tanto como puedo, pero al editar un sitio de Magento, no estoy en condiciones de revisar y cambiar el nombre de cada función y ordenar el espacio de nombres.
Dave Child
7

Te encontrarás con muchos problemas al ejecutar PHPCS con tu código PHP mezclado con HTML. PHPCS solo es realmente útil cuando analiza scripts PHP puros. Los estándares de codificación integrados se basan en PHP puro, no en PHP / HTML mixto.

Una opción sería construir su propio estándar personalizado y usarlo en su lugar. El estándar personalizado tendría en cuenta la mezcla de código, pero probablemente sería difícil escribirlo.

La otra opción es usar un sistema de plantillas ya que dijiste que no quieres pasar a un marco. Smarty y Twig se pueden usar fuera de un marco MVC. Vaya a uno de esos y luego haga que PHPCS solo analice los archivos .PHP, no los archivos de plantilla.

dragonmantank
fuente