Office.in.th
คู่มือระบบ เนื้อหาผ่านการตรวจสอบแล้ว

การใช้งาน Static Analysis Tools

บทความนี้แนะนำ Static Analysis Tools ซึ่งเป็นการวิเคราะห์โค้ดโดยไม่ต้องรันโปรแกรมจริง เพื่อตรวจจับข้อผิดพลาด, ปรับปรุงคุณภาพโค้ด, และค้นหาช่องโหว่ด้านความปลอดภั...

การใช้งาน Static Analysis Tools

ในบทที่แล้ว เราได้เรียนรู้เกี่ยวกับการทำ Code Coverage ด้วย PHPUnit เพื่อวัดว่า Unit Tests ของเราครอบคลุมโค้ดมากน้อยแค่ไหน ในบทนี้ เราจะมาทำความรู้จักกับอีกหนึ่งเครื่องมือสำคัญที่จะช่วยให้เราพัฒนาโค้ดที่มีคุณภาพสูงขึ้น นั่นคือ Static Analysis Tools

Static Analysis คืออะไร?

Static Analysis คือการวิเคราะห์โค้ดโดยที่ไม่ต้องรันโปรแกรมจริง (ต่างจาก Dynamic Analysis ที่เป็นการวิเคราะห์ขณะโปรแกรมทำงาน) เครื่องมือ Static Analysis จะทำการตรวจสอบโค้ดของเราเพื่อหาข้อผิดพลาดที่อาจเกิดขึ้น, ช่องโหว่ด้านความปลอดภัย, หรือจุดที่อาจทำให้เกิดปัญหาในอนาคต โดยอิงตามกฎเกณฑ์และรูปแบบที่กำหนดไว้

Static Analysis เป็นเหมือนกับการตรวจสุขภาพโค้ดของเราก่อนที่จะนำไปใช้งานจริง ช่วยให้เราค้นพบและแก้ไขปัญหาได้ตั้งแต่เนิ่นๆ ซึ่งจะช่วยลดความเสี่ยงที่จะเกิด Bug ใน Production และประหยัดเวลาในการ Debug ในภายหลัง

ทำไมต้องใช้ Static Analysis?

  • Finding Errors: ช่วยตรวจจับข้อผิดพลาดที่อาจหลุดรอดจากการทดสอบ เช่น การใช้ตัวแปรที่ไม่ได้กำหนดค่า, การเรียก Method ที่ไม่มีอยู่จริง, หรือการใช้ Type ผิดประเภท
  • Improving Code Quality: ช่วยปรับปรุงคุณภาพของโค้ดโดยรวม เช่น การตรวจจับ Code Duplication, ความซับซ้อนของโค้ดที่มากเกินไป, หรือการละเมิด Coding Standards
  • Security Vulnerabilities: ช่วยค้นหาช่องโหว่ด้านความปลอดภัยที่อาจถูกโจมตีได้ เช่น SQL Injection หรือ Cross-Site Scripting (XSS)
  • Enforcing Coding Standards: ช่วยให้ทีมพัฒนาปฏิบัติตาม Coding Standards ที่กำหนดไว้ ทำให้โค้ดมีความสอดคล้องกันและง่ายต่อการบำรุงรักษา
  • Early Detection: ช่วยตรวจจับปัญหาได้ตั้งแต่เนิ่นๆ ในขั้นตอนการพัฒนา ทำให้แก้ไขได้ง่ายและประหยัดค่าใช้จ่ายมากกว่าการแก้ไขปัญหาที่เกิดขึ้นใน Production

เครื่องมือ Static Analysis ที่นิยมใช้ใน PHP

มีเครื่องมือ Static Analysis หลายตัวที่สามารถใช้งานได้กับ PHP แต่ที่นิยมใช้กันอย่างแพร่หลายมีอยู่สองตัวหลักๆ คือ:

  • Psalm: เป็นเครื่องมือ Static Analysis ที่เน้นการตรวจจับ Type Errors และข้อผิดพลาดที่เกี่ยวข้องกับ Type Hinting ใน PHP
  • PHPStan: เป็นเครื่องมือ Static Analysis ที่เน้นการตรวจจับข้อผิดพลาดที่อาจเกิดขึ้นใน Runtime และช่วยปรับปรุงคุณภาพของโค้ดโดยรวม

ทั้ง Psalm และ PHPStan เป็นเครื่องมือ Open Source ที่สามารถติดตั้งและใช้งานได้ฟรีผ่าน Composer

ตัวอย่างการใช้งาน Psalm

เราจะเริ่มต้นด้วยการติดตั้ง Psalm ผ่าน Composer:

composer require --dev vimeo/psalm

หลังจากติดตั้งเสร็จแล้ว เราสามารถรัน Psalm เพื่อวิเคราะห์โค้ดของเราได้โดยใช้คำสั่ง:

./vendor/bin/psalm

Psalm จะทำการวิเคราะห์โค้ดในโปรเจกต์ของเราและแสดงผลลัพธ์ออกมา หากพบข้อผิดพลาดหรือ Warning, Psalm จะแจ้งให้เราทราบพร้อมทั้งระบุตำแหน่งของโค้ดที่มีปัญหา

ตัวอย่าง: สมมติว่าเรามีโค้ด PHP ดังนี้:


<?php

/**
 * @param string $name
 * @return string
 */
function greet(string $name) {
    return "Hello, " . $name;
}

$age = 30;
echo greet($age);

เมื่อรัน Psalm กับโค้ดนี้ เราจะได้รับ Warning:


src/index.php:9 - InvalidArgument - Argument 1 of greet expects string, but int provided

Warning นี้บอกว่า ฟังก์ชัน `greet` คาดหวัง Parameter เป็น `string` แต่เราส่ง `int` เข้าไป ทำให้ Psalm แจ้งเตือนเราถึงข้อผิดพลาดที่อาจเกิดขึ้น

เราสามารถแก้ไขโค้ดได้โดยการแปลง `$age` เป็น `string` ก่อนที่จะส่งเข้าไปในฟังก์ชัน `greet`:


<?php

/**
 * @param string $name
 * @return string
 */
function greet(string $name) {
    return "Hello, " . $name;
}

$age = 30;
echo greet((string) $age);

เมื่อแก้ไขโค้ดแล้วรัน Psalm อีกครั้ง เราจะไม่ได้รับ Warning นี้อีก

ตัวอย่างการใช้งาน PHPStan

การติดตั้ง PHPStan ผ่าน Composer ก็ทำได้ง่ายๆ เช่นกัน:

composer require --dev phpstan/phpstan

หลังจากติดตั้งเสร็จแล้ว เราสามารถรัน PHPStan เพื่อวิเคราะห์โค้ดของเราได้โดยใช้คำสั่ง:

./vendor/bin/phpstan analyse

PHPStan จะทำการวิเคราะห์โค้ดในโปรเจกต์ของเราและแสดงผลลัพธ์ออกมา หากพบข้อผิดพลาดหรือ Warning, PHPStan จะแจ้งให้เราทราบพร้อมทั้งระบุตำแหน่งของโค้ดที่มีปัญหา

ตัวอย่าง: สมมติว่าเรามีโค้ด PHP ดังนี้:


<?php

function calculateArea(int $width, int $height) {
    $area = $width * $lenght; // Notice the typo: $lenght instead of $height
    return $area;
}

echo calculateArea(10, 5);

เมื่อรัน PHPStan กับโค้ดนี้ เราจะได้รับ Error:


10  Variable $lenght might not be defined.

Error นี้บอกว่า ตัวแปร `$lenght` อาจจะยังไม่ได้ถูกกำหนดค่า ซึ่งเป็นเพราะเราพิมพ์ผิด (พิมพ์ `lenght` แทน `height`) ทำให้ PHPStan ช่วยเราตรวจจับข้อผิดพลาดนี้ได้

เราสามารถแก้ไขโค้ดได้โดยการแก้ไขตัวแปรให้ถูกต้อง:


<?php

function calculateArea(int $width, int $height) {
    $area = $width * $height;
    return $area;
}

echo calculateArea(10, 5);

เมื่อแก้ไขโค้ดแล้วรัน PHPStan อีกครั้ง เราจะไม่ได้รับ Error นี้อีก

การ Config Static Analysis Tools

ทั้ง Psalm และ PHPStan อนุญาตให้เรากำหนดค่า Config เพื่อปรับแต่งการทำงานของเครื่องมือให้เหมาะสมกับโปรเจกต์ของเราได้ โดยเราสามารถกำหนดค่า Config ต่างๆ เช่น:

  • Level of Analysis: กำหนดระดับความเข้มงวดในการวิเคราะห์โค้ด
  • Ignored Errors: กำหนด Error หรือ Warning ที่เราต้องการ Ignore
  • Paths to Analyze: กำหนด Path ของไฟล์หรือ Directory ที่เราต้องการวิเคราะห์
  • Coding Standards: กำหนด Coding Standards ที่เราต้องการให้เครื่องมือตรวจสอบ

การ Config Static Analysis Tools อย่างเหมาะสมจะช่วยให้เราได้รับผลลัพธ์ที่แม่นยำและตรงกับความต้องการของเรามากที่สุด

Static Analysis กับ CI/CD

Static Analysis สามารถนำไปรวมเข้ากับ CI/CD Pipeline ของเราได้ เพื่อให้เครื่องมือทำการวิเคราะห์โค้ดโดยอัตโนมัติทุกครั้งที่มีการ Commit หรือ Push โค้ด การทำเช่นนี้จะช่วยให้เราตรวจจับปัญหาได้ตั้งแต่เนิ่นๆ และป้องกันไม่ให้โค้ดที่มีปัญหาถูกนำไป Deploy ใน Production

ข้อควรระวัง: การใช้ Static Analysis Tools ไม่ได้หมายความว่าโค้ดของเราจะไม่มี Bug เลย Static Analysis เป็นเพียงเครื่องมือที่ช่วยเราตรวจจับข้อผิดพลาดบางประเภทเท่านั้น การทดสอบ (Unit Testing, Integration Testing, etc.) และการตรวจสอบโค้ดโดยมนุษย์ (Code Review) ยังคงเป็นสิ่งสำคัญในการพัฒนาโค้ดที่มีคุณภาพสูง

สรุป

Static Analysis Tools เป็นเครื่องมือที่มีประโยชน์อย่างมากในการพัฒนาโค้ด PHP ที่มีคุณภาพสูง ช่วยให้เราตรวจจับข้อผิดพลาด, ปรับปรุงคุณภาพของโค้ด, และป้องกันช่องโหว่ด้านความปลอดภัยได้ตั้งแต่เนิ่นๆ การใช้งาน Static Analysis Tools ควบคู่ไปกับการทดสอบและการตรวจสอบโค้ดโดยมนุษย์ จะช่วยให้เรามั่นใจได้ว่าโค้ดของเรามีความน่าเชื่อถือและปลอดภัยมากยิ่งขึ้น

ในบทถัดไป เราจะมาเรียนรู้เกี่ยวกับการ Config Logging สำหรับ Production เพื่อให้เราสามารถติดตามและแก้ไขปัญหาที่เกิดขึ้นในระบบได้อย่างมีประสิทธิภาพ

Office.in.th Custom Service

ต้องการพัฒนาระบบหรือปรับแต่งจากโครงสร้างนี้?

Office.in.th รับพัฒนาและออกแบบ Enterprise Web Application, API Integration และระบบบริหารงานภาครัฐ/เอกชน พร้อมการสนับสนุนระยะยาว

ดูบริการรับพัฒนาซอฟต์แวร์