การใช้งาน 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 เพื่อให้เราสามารถติดตามและแก้ไขปัญหาที่เกิดขึ้นในระบบได้อย่างมีประสิทธิภาพ