วิธีการละเว้นข้อผิดพลาดมาตรฐานการเข้ารหัสใน PHP CodeSniffer


14

เรามีแอปพลิเคชั่นเว็บ PHP 5 และขณะนี้เรากำลังประเมินPHP CodeSnifferเพื่อตัดสินใจว่าการบังคับให้มาตรฐานรหัสปรับปรุงคุณภาพรหัสโดยไม่ทำให้ปวดหัวมากเกินไป หากดูเหมือนว่าดีเราจะเพิ่มตะขอผูกมัดล่วงหน้าของ SVN เพื่อให้มั่นใจว่าไฟล์ใหม่ทั้งหมดที่สร้างขึ้นในสาขา dev ไม่มีการเข้ารหัสกลิ่นมาตรฐาน

มีวิธีการกำหนดค่าโค้ด PHPSniffer เพื่อละเว้นข้อผิดพลาดบางประเภทหรือไม่? หรือใช้เพื่อจัดการข้อผิดพลาดบางอย่างเป็นการเตือนแทน?

นี่คือตัวอย่างที่แสดงให้เห็นถึงปัญหา:

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

และนี่คือผลลัพธ์ของ PHP_CodeSniffer:

> phpcs test.php 

-------------------------------------------------- ------------------------------
พบข้อผิดพลาด 2 ข้อและ 1 คำเตือนที่กระทบ 3 บรรทัด
-------------------------------------------------- ------------------------------
  1 | คำเตือน | บรรทัดมีความยาวเกิน 85 อักขระ มี 121 ตัวอักษร
  9 | ข้อผิดพลาด ไม่พบความคิดเห็นเอกสารของไฟล์
 11 | ข้อผิดพลาด เยื้องสายไม่ถูกต้อง คาดว่า 0 ช่องว่างพบ 4
-------------------------------------------------- ------------------------------

ฉันมีปัญหากับข้อผิดพลาด "การเยื้องบรรทัดไม่ถูกต้อง " ฉันเดาว่ามันเกิดขึ้นเพราะฉันผสมการเยื้อง PHP กับการเยื้อง HTML แต่นี่ทำให้อ่านง่ายขึ้นใช่ไหม ( คำนึงถึงว่าฉันไม่มีทรัพยากรที่จะย้ายไปยังกรอบ MVC ในขณะนี้ ) ดังนั้นฉันต้องการที่จะไม่สนใจมันได้โปรด


1
นี่เป็นคำถามเกี่ยวกับการเขียนโปรแกรม IMO มากเกินไปที่จะอยู่ที่นี่ .. เนื่องจากเป็นเรื่องเกี่ยวกับ "LINT" เช่นยูทิลิตี้ที่ส่วนใหญ่จะเป็นที่สนใจของโปรแกรมเมอร์ฮาร์ดคอร์ไม่จำเป็นต้องเป็นเว็บมาสเตอร์ แต่มันถูกถามและจัดรูปแบบเป็นอย่างดีดังนั้นเราจึงสามารถทิ้งมันไว้ได้ในตอนนี้
Jeff Atwood

2
เกี่ยวกับคำเตือนบรรทัดที่ 1: ฉันขอแนะนำให้ใช้ HTML5 DOCTYPE ได้ไหม
luiscubal

ขอบคุณสำหรับคำติชมของคุณเจฟฟ์ - ฉันมีความสุขที่จะย้าย ฉันควรจะรู้เมื่อไม่มีแท็ก PHP เมื่อฉันสร้างคำถาม :-)
Tom

@ luiscubal - เขาเขาคำแนะนำที่ดี; เหมือนความคิดของคุณ ;-)
ทอม

คำตอบ:


11

ฉันพบวิธีแก้ไขข้อผิดพลาด" Line เยื้องไม่ถูกต้อง " แต่ก่อนอื่นฉันควรจะบอกว่าdragonmantankมีจุดที่ยอดเยี่ยม - คุณไม่ควรผสม PHP และ HTML มันเป็นสูตรสำหรับอาการปวดหัว อย่างไรก็ตามน่าเสียดายที่ฉันคิดว่าการผสม PHP และ HTML เป็นเรื่องธรรมดามากโดยเฉพาะในซอฟต์แวร์รุ่นเก่า

การแก้ไขที่เร็วและสกปรกที่สุดสมมติว่าเราใช้phpcsมาตรฐานการเข้ารหัสเริ่มต้น (ซึ่งเป็นมาตรฐานลูกแพร์ ) คือการลบไฟล์ Sniff ที่เกี่ยวข้อง ค้นหาตำแหน่งของมาตรฐานลูกแพร์สำหรับฉันโดยใช้Ubuntuมันอยู่ที่นี่:

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

เปลี่ยนชื่อScopeIndentSniff.phpไฟล์เพื่อให้ sniff ที่ตรวจสอบการเยื้องรหัสจะไม่ถูกเรียกใช้อีกต่อไป:

> sudo mv ScopeIndentSniff.php ScopeIndentSniff.php.bk

งานเสร็จแล้ว - ตอนนี้การเยื้องจะไม่ถูกตรวจสอบและข้อผิดพลาด "การเยื้องสายไม่ถูกต้อง " จะไม่เกิดขึ้น ( และรหัสของคุณจะไม่ได้มาตรฐานและจะไม่ได้คุณภาพสูง! )


วิธีการแก้ปัญหาข้างต้นเป็นมือสมัครเล่นที่สวย - น้ำยาทำความสะอาดคือการสร้างมาตรฐานการเข้ารหัสใหม่ซึ่งใช้มาตรฐานลูกแพร์ทั้งหมดยกเว้นเชอร์รี่ที่คุณเลือกเอง นี่เป็นสิ่งที่ต้องทำอย่างรวดเร็ว นี่คือวิธีการใช้getIncludedSniffs()และgetExcludedSniffs()และphpcsอนุสัญญาการตั้งชื่อ:

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

ทดสอบมาตรฐานการเข้ารหัสที่กำหนดเองใหม่ของคุณโดยเรียกphpcsใช้การ--standardตั้งค่าสถานะ ตัวอย่างเช่น:

> phpcs --standard=PEARish Test.php

เมื่อทำงานแล้วคุณสามารถตั้งค่ามาตรฐานใหม่เป็นค่าเริ่มต้นซึ่งหมายความว่าคุณไม่จำเป็นต้องพิมพ์การ--standardตั้งค่าสถานะทุกครั้งที่คุณใช้phpcs:

> sudo phpcs --config-set default_standard PEARish

ดูคู่มือ phpcsสำหรับข้อมูลเพิ่มเติม


นี่เป็นประโยชน์จริงๆ - ฉันใช้คำตอบนี้เพื่อลบข้อผิดพลาดที่เกิดขึ้นตามแนวของ "คลาสจะต้องอยู่ในเนมสเปซอย่างน้อยหนึ่งระดับ" พร้อมกับข้อผิดพลาดในการตั้งชื่อฟังก์ชันอูฐกรณี ฉันใช้ PSR2 มากที่สุดเท่าที่จะทำได้ แต่การแก้ไขเว็บไซต์ Magento ฉันไม่ได้อยู่ในตำแหน่งที่จะผ่านและเปลี่ยนชื่อทุกฟังก์ชั่นและเรียงลำดับการกำหนดชื่อ
เดฟเด็ก

7

คุณจะพบปัญหามากมายในการใช้งาน PHPCS ด้วยโค้ด PHP ของคุณผสมกับ HTML PHPCS มีประโยชน์จริง ๆ เมื่อคุณแยกวิเคราะห์สคริปต์ PHP ล้วนๆเท่านั้น มาตรฐานการเข้ารหัสในตัวนั้นสร้างขึ้นจาก PHP ล้วนๆไม่ได้ผสมกับ PHP / HTML

ทางเลือกหนึ่งคือการสร้างมาตรฐานที่คุณกำหนดเองและใช้สิ่งนั้นแทน มาตรฐานที่กำหนดเองจะคำนึงถึงการผสมของรหัส แต่อาจเป็นความเจ็บปวดในการเขียน

ตัวเลือกอื่นคือใช้ระบบ templating เนื่องจากคุณบอกว่าคุณไม่ต้องการย้ายไปที่เฟรมเวิร์ก ทั้งฉลาดและทวิกสามารถใช้ได้ทั้งนอกกรอบ MVC ย้ายไปที่หนึ่งในนั้นแล้วให้ PHPCS วิเคราะห์ไฟล์. PHP เท่านั้นไม่ใช่ไฟล์เทมเพลต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.