Jak zignorować niektóre standardowe błędy kodowania w PHP CodeSniffer

14

Mamy aplikację internetową PHP 5 i obecnie oceniamy PHP CodeSniffer , aby zdecydować, czy wymuszenie standardów kodu poprawia jakość kodu bez powodowania nadmiernego bólu głowy. Jeśli wydaje się to dobre, dodamy hak wstępnego zatwierdzania SVN, aby upewnić się, że wszystkie nowe pliki zatwierdzone w gałęzi deweloperskiej są wolne od kodowania standardowych zapachów.

Czy istnieje sposób skonfigurowania kodu PHP CodeSniffer, aby ignorował określony typ błędu? lub może potraktować określony błąd jako ostrzeżenie?

Oto przykład pokazujący problem:

<!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>

A to jest wynik PHP_CodeSniffer:

> phpcs test.php 

-------------------------------------------------- ------------------------------
ZNALEZIONO 2 BŁĘDY I 1 OSTRZEŻENIA DOTYCZĄCE 3 LINII
-------------------------------------------------- ------------------------------
  1 | OSTRZEŻENIE | Linia przekracza 85 znaków; zawiera 121 znaków
  9 | BŁĄD | Brak komentarza do pliku doc
 11 | BŁĄD | Nieprawidłowe wcięcie linii; oczekiwane 0 spacji, znaleziono 4
-------------------------------------------------- ------------------------------

Mam problem z błędemNiepoprawne wcięcie wiersza ”. Wydaje mi się, że tak się dzieje, ponieważ mieszam wcięcia PHP z wcięciami HTML. Ale to czyni go bardziej czytelnym, prawda? ( biorąc pod uwagę, że nie mam teraz zasobów, aby przejść do frameworka MVC ). Więc chciałbym to zignorować.

Tomek
źródło
1
jest to trochę za dużo pytań programowych IMO, aby tu być… ponieważ chodzi o narzędzie typu „LINT”, które zainteresowałoby się przede wszystkim hardkorowymi programistami, niekoniecznie webmasterami. Ale jest ładnie zadane i sformatowane, więc na razie możemy to zostawić.
Jeff Atwood
2
Informacje o ostrzeżeniu w wierszu 1: Czy mogę zasugerować użycie DOCTYPE HTML5?
luiscubal
Dziękujemy za opinię Jeff - cieszę się, że mogę to przenieść. Prawdopodobnie powinienem był zdać sobie sprawę z tego, że nie było tagu PHP podczas tworzenia pytania :-).
Tom
@luiscubal - on, dobra sugestia; jak twoje myślenie ;-)
Tom

Odpowiedzi:

11

Znalazłem rozwiązanie pozwalające usunąć błąd „ Niepoprawne wcięcie wiersza ”, ale najpierw muszę powiedzieć, że dragonmantank ma doskonałą rację - nie należy mieszać PHP i HTML. To przepis na bóle głowy. Niestety niestety myślę, że mieszanie PHP i HTML jest bardzo powszechne, szczególnie w starszym oprogramowaniu.

Najszybszą i najbrudniejszą poprawką przy założeniu, że używamy phpcsdomyślnych standardów kodowania (które są standardami PEAR ), jest usunięcie odpowiedniego pliku Sniff. Znajdź lokalizację standardów PEAR, dla mnie, używając Ubuntu , było tutaj:

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

Zmień nazwę ScopeIndentSniff.phppliku, aby wąchanie sprawdzające wcięcie kodu nie było już wykonywane:

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Zadanie wykonane - teraz wcięcie nie będzie sprawdzane i nie pojawi się błąd „ Niepoprawne wcięcie wiersza ” ( a kod nie będzie standardowy i nie będzie tak wysokiej jakości! ).


Powyższe rozwiązanie jest dość amatorskie - czystszym rozwiązaniem jest stworzenie nowego standardu kodowania, który będzie korzystał ze wszystkich standardów PEAR, z wyjątkiem dostosowanych przez ciebie konfiguracji. To jest bardzo szybkie. Oto jak to zrobić używając getIncludedSniffs()i getExcludedSniffs()a pewne phpcskonwencje nazewnictwa:

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');
    }
}
?>

Przetestuj swój nowy niestandardowy standard kodowania, wywołując phpcsza pomocą --standardflagi. Na przykład:

> phpcs --standard=PEARish Test.php

Gdy już zacznie działać, możesz ustawić nowy standard jako domyślny, co oznacza, że ​​nie musisz wpisywać --standardflagi przy każdym użyciu phpcs:

> sudo phpcs --config-set default_standard PEARish

Aby uzyskać więcej informacji, zobacz instrukcję phpcs .

Tomek
źródło
To było bardzo przydatne - użyłem tej odpowiedzi do usunięcia błędów pojawiających się w stylu „Klasa musi być w przestrzeni nazw co najmniej jednego poziomu” wraz z błędami nazewnictwa funkcji wielbłąda. Używam PSR2, jak tylko mogę, ale edytując witrynę Magento, nie jestem w stanie przejść i zmienić nazwy każdej funkcji i uporządkować przestrzeni nazw.
Dave Child,
7

Będziesz mieć wiele problemów z uruchomieniem PHPCS z kodem PHP zmieszanym z HTML. PHPCS jest naprawdę użyteczny tylko podczas analizowania czystych skryptów PHP. Wbudowane standardy kodowania są zbudowane wokół czystego PHP, a nie mieszanego PHP / HTML.

Jedną z opcji byłoby zbudowanie własnego niestandardowego standardu i użycie go zamiast tego. Standard niestandardowy uwzględniałby mieszanie kodu, ale pisanie go byłoby prawdopodobnie trudne.

Inną opcją jest użycie systemu szablonów, ponieważ powiedziałeś, że nie chcesz przejść do frameworka. Smarty i Twig mogą być używane poza frameworkiem MVC. Przejdź do jednego z nich, a następnie PHPCS przeanalizuj tylko pliki .PHP, a nie pliki szablonów.

Dragonmantank
źródło