Làm thế nào để bỏ qua các lỗi tiêu chuẩn mã hóa nhất định trong PHP CodeSniffer


14

Chúng tôi có một ứng dụng web PHP 5 và chúng tôi hiện đang đánh giá PHP CodeSniffer để quyết định xem việc buộc các tiêu chuẩn mã có cải thiện chất lượng mã mà không gây quá nhiều đau đầu hay không. Nếu nó có vẻ tốt, chúng tôi sẽ thêm một hook pre-commit SVN để đảm bảo tất cả các tệp mới được cam kết trên nhánh dev không có mùi mã hóa tiêu chuẩn.

Có cách nào để cấu hình PHP codeSniffer để bỏ qua một loại lỗi cụ thể không? hoặc nhận nó để xử lý một lỗi nhất định như một cảnh báo thay thế?

Dưới đây là một ví dụ để chứng minh vấn đề:

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

Và đây là đầu ra của PHP_CodeSniffer:

> phpc test.php 

-------------------------------------------------- ------------------------------
TÌM 2 L ERI (S) VÀ 1 CẢNH BÁO (S) ẢNH HƯỞNG 3 LINE (S)
-------------------------------------------------- ------------------------------
  1 | CẢNH BÁO | Dòng vượt quá 85 ký tự; chứa 121 ký tự
  9 | LRI | Thiếu tập tin doc bình luận
 11 | LRI | Dòng thụt lề không chính xác; 0 không gian dự kiến, tìm thấy 4
-------------------------------------------------- ------------------------------

Tôi gặp vấn đề với lỗi " Dòng thụt lề không chính xác ". Tôi đoán nó xảy ra bởi vì tôi đang trộn thụt lề PHP với thụt lề HTML. Nhưng điều này làm cho nó dễ đọc hơn phải không? ( có tính đến việc tôi không có nguồn lực để chuyển sang khung MVC ngay bây giờ ). Vì vậy, tôi muốn bỏ qua nó xin vui lòng.


1
đây là một câu hỏi quá nhiều về lập trình IMO ở đây .. vì đó là về một tiện ích giống như "LINT" mà hầu hết các lập trình viên khó tính, không nhất thiết phải là quản trị viên web. Nhưng nó được yêu cầu và định dạng độc đáo, vì vậy chúng ta có thể để nó bây giờ.
Jeff Atwood

2
Về cảnh báo dòng 1: Tôi có thể đề xuất sử dụng HTML5 DOCTYPE không?
luiscubal

Cảm ơn phản hồi của bạn Jeff - Tôi rất vui khi di chuyển nó. Tôi có lẽ đã nhận ra khi không có thẻ PHP khi tôi tạo câu hỏi :-).
Tom

@luiscubal - he he, đề nghị tốt; như suy nghĩ của bạn ;-)
Tom

Câu trả lời:


11

Tôi đã tìm thấy một giải pháp để loại bỏ lỗi " Dòng thụt lề không chính xác " nhưng trước tiên tôi nên nói rằng dragonmantank có một điểm tuyệt vời - bạn không nên trộn lẫn PHP và HTML. Nó là một công thức cho đau đầu. Tuy nhiên, thật không may, tôi nghĩ rằng việc trộn PHP và HTML là rất phổ biến, đặc biệt là trong phần mềm cũ.

Cách khắc phục nhanh nhất và bẩn nhất giả định rằng chúng tôi đang sử dụng các phpcstiêu chuẩn mã hóa mặc định (là các tiêu chuẩn PEAR ) là xóa tệp Sniff có liên quan. Tìm vị trí của các tiêu chuẩn PEAR, đối với tôi, bằng cách sử dụng Ubuntu , nó đã ở đây:

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

Đổi tên ScopeIndentSniff.phptệp để sniff kiểm tra thụt mã sẽ không còn được thực thi:

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

Công việc đã hoàn thành - bây giờ việc thụt lề sẽ không được kiểm tra và lỗi " Dòng thụt không chính xác " sẽ không xảy ra ( và mã của bạn sẽ không phải là tiêu chuẩn và sẽ không có chất lượng cao như vậy! ).


Giải pháp trên khá nghiệp dư - giải pháp sạch hơn là tạo ra một tiêu chuẩn mã hóa mới sử dụng tất cả các tiêu chuẩn PEAR ngoại trừ các tùy chỉnh anh đào của bạn. Điều này rất nhanh để làm. Dưới đây là làm thế nào để làm điều đó bằng getIncludedSniffs()getExcludedSniffs()và một số phpcsquy ước đặt tên:

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

Kiểm tra tiêu chuẩn mã hóa tùy chỉnh mới của bạn bằng cách gọi phpcsbằng --standardcờ. Ví dụ:

> phpcs --standard=PEARish Test.php

Khi nó hoạt động, bạn có thể đặt tiêu chuẩn mới của mình làm mặc định, điều đó có nghĩa là bạn không cần nhập --standardcờ mỗi lần bạn sử dụng phpcs:

> sudo phpcs --config-set default_standard PEARish

Xem hướng dẫn sử dụng phpc để biết thêm thông tin.


Điều này thực sự tiện dụng - Tôi đã sử dụng câu trả lời này để loại bỏ các lỗi xuất hiện dọc theo dòng "Lớp phải ở trong một không gian tên ít nhất một cấp" cùng với lỗi đặt tên hàm lạc đà. Tôi đang sử dụng PSR2 nhiều nhất có thể, nhưng chỉnh sửa trang web Magento, tôi không ở vị trí để thực hiện và đổi tên mọi chức năng và sắp xếp không gian tên.
Dave Child

7

Bạn sẽ gặp rất nhiều vấn đề khi chạy PHPCS với mã PHP được trộn lẫn với HTML. PHPCS chỉ thực sự hữu ích khi bạn phân tích các tập lệnh PHP thuần túy. Các tiêu chuẩn mã hóa tích hợp được xây dựng xung quanh PHP thuần túy, không trộn lẫn PHP / HTML.

Một lựa chọn sẽ là xây dựng tiêu chuẩn tùy chỉnh của riêng bạn và thay vào đó sử dụng tiêu chuẩn đó. Tiêu chuẩn tùy chỉnh sẽ tính đến việc trộn mã, nhưng có lẽ sẽ rất khó để viết.

Tùy chọn khác là sử dụng hệ thống tạo khuôn mẫu vì bạn nói rằng bạn không muốn chuyển sang một khung. SmartyTwig đều có thể được sử dụng bên ngoài khung MVC. Di chuyển đến một trong số đó và sau đó có PHPCS chỉ phân tích các tệp .PHP, không phải các tệp mẫu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.