นี่คือคอลเลกชันของการดมกลิ่น PHP_CODESNIFFER (3.X) ที่กำหนดเองของเราสำหรับการตรวจจับข้อบกพร่องที่อาจเกิดขึ้นและพฤติกรรมที่ไม่คาดคิดในรหัส PHP มันอาจใช้เป็นชุดกฎด้วยตัวเอง แต่ส่วนใหญ่มีวัตถุประสงค์เพื่อเป็นชุดของสูดดมแยกต่างหากที่สามารถรวมเข้ากับมาตรฐานอื่น ๆ
เราอธิบายถึงแรงจูงใจเบื้องหลังการดมกลิ่นเหล่านี้ในบล็อกของเรา
ติดตั้งเป็นการพึ่งพาการพัฒนาโดยใช้นักแต่งเพลง:
$ composer require --dev moxio/php-codesniffer-sniffs
ตรวจสอบไฟล์ของคุณกับชุดสูดดมนี้:
$ ./vendor/bin/phpcs --standard=vendor/moxio/php-codesniffer-sniffs/MoxioSniffs path/to/your/files
จะมีการเพิ่มการดมกลิ่นเพิ่มเติมในไม่ช้า
moxiosniffs.php.disallowbarecontinueinswitch : disallows คำสั่ง continue โดยไม่มีอาร์กิวเมนต์ตัวเลขเมื่อใช้โดยตรงภายใน switch - case สิ่งนี้จะช่วยป้องกันข้อบกพร่องเงียบ ๆ ที่เกิดจาก PHP โดยพิจารณาว่า switch เป็นโครงสร้างการวนซ้ำ
moxiosniffs.php.disallowimplicitloosecomparison : disallows การเปรียบเทียบที่ไม่ใช่ Strict โดยนัยโดยฟังก์ชั่นเช่น in_array และ array_search ต้องการให้มีการตั้งค่า $strict -parameter สำหรับฟังก์ชั่นเหล่านี้อย่างชัดเจน สิ่งนี้จะช่วยป้องกันข้อบกพร่องที่ซ่อนอยู่เนื่องจากพฤติกรรมตอบโต้ที่ใช้งานง่ายของการเปรียบเทียบที่ไม่ใช่การ จำกัด
moxiosniffs.php.disallowimplicitloosebase64decode : disallows การใช้งานที่ไม่ จำกัด โดยนัยของฟังก์ชัน base64_decode กำหนดให้มีการตั้งค่า $strict -parameter ของฟังก์ชั่นนี้อย่างชัดเจน
moxiosniffs.php.disallowuniqidwithout moreentropy: disallows เรียกไปยัง uniqid() โดยไม่มี $more_entropy = true เมื่อ $more_entropy เป็น false (ซึ่งเป็นค่าเริ่มต้น), uniqid() เรียก usleep() เพื่อหลีกเลี่ยงการชนซึ่งอาจเป็นผลงานที่สำคัญ เรียก uniqid() เสมอด้วย $more_entropy = true หลีกเลี่ยงปัญหาเหล่านี้
moxiosniffs.php.disallowarraycombinerswithsinglearray : disallows เรียกใช้ฟังก์ชั่นที่รวมสองอาร์เรย์ขึ้นไปกับอาร์เรย์เดียวที่ให้ไว้เป็นอาร์กิวเมนต์ สิ่งนี้ใช้กับฟังก์ชั่นเช่น array_merge(_recursive) , array_replace(_recursive) และตัวแปรทั้งหมดของ array_diff และ array_intersect การโทรดังกล่าวไม่สมเหตุสมผลและน่าจะเป็นผลมาจากเครื่องหมายจุลภาคหรือวงเล็บที่หายไป หากต้องการดัชนีอาร์เรย์เดียวเพียงใช้ array_values
Moxiosniffs.php.disallowimplicitmicrotimeasstring : disallows เรียกไปยัง microtime() โดยไม่มีการตั้งค่า $get_as_float ถูกตั้งค่าอย่างชัดเจน โดยค่าเริ่มต้น microtime มีสตริงเป็นค่าส่งคืน ("MSEC SEC") ซึ่งไม่คาดคิดและไม่สามารถโยนได้อย่างไร้เดียงสาในการลอยทำให้เกิดข้อผิดพลาดได้ง่าย ยังคงเป็นไปได้ที่จะตั้งค่าอาร์กิวเมนต์นี้เป็น false แต่ในกรณีนั้นคุณอาจคิดเกี่ยวกับเรื่องนี้
moxiosniffs.php.disallowimplentientiteratortoarraywithusekeys : disallows เรียกไปที่ iterator_to_array() โดยไม่มีการตั้งค่าอาร์กิวเมนต์ $use_keys ถูกตั้งค่าอย่างชัดเจน โดยค่าเริ่มต้น iterator_to_array ใช้คีย์ที่จัดทำโดย ITERATOR พฤติกรรมนี้มักจะเป็นที่ต้องการสำหรับอาร์เรย์เชื่อมโยง แต่อาจทำให้ผลลัพธ์ที่ไม่คาดคิดสำหรับอาร์เรย์ 'เหมือนรายการ' กำหนดให้มีการตั้งค่าพารามิเตอร์อย่างชัดเจนทำให้มั่นใจได้ว่านักพัฒนาจะต้องคิดว่าพฤติกรรมใดที่ต้องการสำหรับสถานการณ์ในมือ
moxiosniffs.php.disallowdatetime : ไม่อนุญาตการใช้งานของ DateTime และส่งเสริมการใช้ DateTimeImmutable แทน อดีตที่ไม่แน่นอนสามารถนำไปสู่ข้อบกพร่องบางอย่างที่บอบบาง แต่น่ารังเกียจ ดูโพสต์นี้สำหรับพื้นหลังเพิ่มเติมว่าทำไมคุณถึงต้องการกีดกันการใช้ DateTime
moxiosniffs.php.disallowmbdetectencoding : disallows การใช้งานของ mb_detect_encoding ฟังก์ชั่นนี้มีชื่อที่ทำให้เข้าใจผิดซึ่งหมายถึงมันสามารถตรวจจับการเข้ารหัสของสตริงซึ่งเป็นปัญหาที่เป็นไปไม่ได้โดยทั่วไป ค่อนข้างจะตรวจสอบรายการการเข้ารหัสจนกว่าจะพบหนึ่งที่ อาจ เป็นรายการที่ถูกต้อง (เช่นสตริงเป็นลำดับไบต์ที่ถูกต้องตามการเข้ารหัสนั้น) การใช้ mb_check_encoding (อาจอยู่ในลูป) แทนที่จะทำให้สิ่งนี้ชัดเจนยิ่งขึ้น ดูการพูดคุยนี้สำหรับข้อมูลพื้นหลังเพิ่มเติมในหัวข้อนี้
moxiosniffs.php.disallowutf8encodeDecode : disallows เรียกใช้ utf8_encode() และ utf8_decode() ฟังก์ชั่นเหล่านี้ถือได้ว่าทำให้เข้าใจผิดเพราะพวกเขาแปลงเป็น/จาก ISO-8859-1 เท่านั้นและไม่ 'ตรวจจับการเข้ารหัสแหล่งที่มา/เป้าหมาย การใช้ iconv() หรือ mb_convert_encoding() แทนที่จะทำให้การเข้ารหัสอักขระทั้งสองที่มีบทบาทในการแปลงอย่างชัดเจน
moxiosniffs.php.disallowdatecreateFromFormatwithUnspecifiedTimecomponent : disallows เรียกไป DateTime::createFromFormat , DateTimeImmutable::createFromFormat date_create_immutable_from_format date_create_from_format สิ่งนี้จะสร้างวัตถุ dateTime (ไม่เปลี่ยนรูป) ด้วยส่วนประกอบเวลาที่ตั้งค่าเป็นเวลา (การสร้าง) ปัจจุบันซึ่งอาจไม่เคยเป็นสิ่งที่คุณต้องการและอาจเป็นแหล่งที่มาของข้อบกพร่อง
หลังจากติดตั้งการพึ่งพา (รวมถึงการพึ่งพาการพัฒนา) โดยใช้นักแต่งเพลงแล้ว
$ ./vendor/bin/phpunit
จากโครงการรูท Dir
โครงการนี้ปฏิบัติตามเวอร์ชันความหมาย
โปรดทราบว่าจากมุมมองของไลบรารีนี้เป็นคอลเลกชันที่เลือกและจับคู่ของการดมกลิ่น (และไม่ใช่มาตรฐานการเข้ารหัสที่สมบูรณ์) การเพิ่มการดมกลิ่นใหม่จะไม่ถูกพิจารณาว่าเป็นการเปลี่ยนแปลงที่แตกหักและไม่ทำให้หมายเลขรุ่นหลักเพิ่มขึ้น
การดมกลิ่นเหล่านี้ได้รับการปล่อยตัวภายใต้ใบอนุญาต MIT