Bagaimana mengabaikan kesalahan standar pengkodean tertentu di PHP CodeSniffer

14

Kami memiliki aplikasi web PHP 5 dan saat ini kami sedang mengevaluasi PHP CodeSniffer untuk memutuskan apakah memaksa standar kode meningkatkan kualitas kode tanpa menyebabkan terlalu banyak sakit kepala. Jika tampaknya baik, kami akan menambahkan kait pra-komit SVN untuk memastikan semua file baru yang dilakukan pada cabang dev bebas dari pengkodean bau standar.

Apakah ada cara untuk mengkonfigurasi kode PHPNiffer untuk mengabaikan jenis kesalahan tertentu? atau malah memperlakukan kesalahan tertentu sebagai peringatan?

Berikut ini contoh untuk menunjukkan masalah:

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

Dan ini adalah output dari PHP_CodeSniffer:

> phpcs test.php 

-------------------------------------------------- ------------------------------
DITEMUKAN 2 KESALAHAN (S) DAN 1 PERINGATAN (S) MEMPENGARUHI 3 LINE (S)
-------------------------------------------------- ------------------------------
  1 | PERINGATAN | Baris melebihi 85 karakter; berisi 121 karakter
  9 | GALAT | File doc komentar tidak ada
 11 | GALAT | Jalur indentasi salah; diharapkan 0 spasi, ditemukan 4
-------------------------------------------------- ------------------------------

Saya memiliki masalah dengan kesalahan " Saluran indentasi salah ". Saya kira itu terjadi karena saya mencampur indentasi PHP dengan indentasi HTML. Tapi ini membuatnya lebih mudah dibaca bukan? ( dengan mempertimbangkan bahwa saya tidak memiliki sumber daya untuk pindah ke kerangka kerja MVC sekarang ). Jadi saya ingin mengabaikannya.

Tom
sumber
1
ini agak terlalu banyak pertanyaan pemrograman IMO untuk berada di sini .. karena ini tentang "LINT" seperti utilitas yang sebagian besar akan menarik bagi programmer hard-core, belum tentu webmaster. Tapi itu ditanyakan dan diformat dengan baik, jadi kita bisa membiarkannya untuk sekarang.
Jeff Atwood
2
Tentang peringatan baris 1: Bolehkah saya menyarankan menggunakan HTML5 DOCTYPE?
luiscubal
Terima kasih atas tanggapan Anda, Jeff - Saya senang memindahkannya. Saya mungkin seharusnya menyadari ketika tidak ada tag PHP ketika saya membuat pertanyaan :-).
Tom
@luiscubal - he he, saran bagus; seperti pemikiran Anda ;-)
Tom

Jawaban:

11

Saya menemukan solusi untuk menghapus kesalahan " Line indented salah " tetapi pertama-tama saya harus mengatakan bahwa dragonmantank memiliki poin yang sangat bagus - Anda tidak boleh mencampur PHP dan HTML. Ini adalah resep untuk sakit kepala. Namun, sayangnya saya pikir pencampuran PHP dan HTML sangat umum terutama dalam perangkat lunak lama.

Perbaikan tercepat dan paling kotor dengan asumsi kita menggunakan phpcsstandar pengkodean standar (yang merupakan standar PEAR ) adalah menghapus file Sniff yang relevan. Temukan lokasi standar PEAR, bagi saya, menggunakan Ubuntu , ada di sini:

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

Ganti nama ScopeIndentSniff.phpfile sehingga hirupan yang memeriksa lekukan kode tidak akan lagi dijalankan:

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Pekerjaan selesai - sekarang indentasi tidak akan diperiksa dan kesalahan " Line indent salah " tidak akan terjadi ( dan kode Anda tidak akan standar dan tidak akan berkualitas tinggi! ).


Solusi di atas cukup amatir - solusi yang lebih bersih adalah membuat standar pengkodean baru yang menggunakan semua standar PEAR kecuali untuk penyesuaian pilihan cherry Anda. Ini sangat cepat dilakukan. Berikut adalah cara melakukannya menggunakan getIncludedSniffs()dan getExcludedSniffs()dan beberapa phpcskonvensi penamaan:

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

Uji standar pengkodean kustom baru Anda dengan phpcsmenggunakan --standardflag. Sebagai contoh:

> phpcs --standard=PEARish Test.php

Setelah berfungsi, Anda dapat menetapkan standar baru sebagai standar yang artinya Anda tidak perlu mengetik --standardbendera setiap kali menggunakan phpcs:

> sudo phpcs --config-set default_standard PEARish

Lihat manual phpcs untuk informasi lebih lanjut.

Tom
sumber
Ini sangat berguna - saya menggunakan jawaban ini untuk menghapus kesalahan yang muncul di sepanjang baris "Kelas harus dalam namespace setidaknya satu tingkat" bersama dengan kesalahan penamaan fungsi case unta. Saya menggunakan PSR2 sebanyak yang saya bisa, tetapi mengedit situs Magento, saya tidak dalam posisi untuk melalui dan mengganti nama setiap fungsi dan memilah-milah namespacing.
Dave Child
7

Anda akan mengalami banyak masalah menjalankan PHPCS dengan kode PHP Anda dicampur dengan HTML. PHPCS hanya benar-benar berguna ketika Anda menguraikan skrip PHP murni. Standar pengkodean bawaan dibangun di sekitar PHP murni, bukan PHP / HTML campuran.

Salah satu opsi adalah membangun standar kustom Anda sendiri dan menggunakannya. Standar khusus akan mempertimbangkan pencampuran kode, tetapi mungkin akan sulit untuk menulis.

Opsi lainnya adalah menggunakan sistem templating karena Anda mengatakan Anda tidak ingin pindah ke suatu kerangka kerja. Smarty dan Twig keduanya dapat digunakan di luar kerangka kerja MVC. Pindah ke salah satu dari itu dan kemudian hanya PHPCS parsing file .php, bukan file template.

dragonmantank
sumber