メインコンテンツへ移動

เนื้อหาภาษาไทย / タイ語のコンテンツ

システムガイド 内容確認済み

การใช้งาน 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 は、エンタープライズ Web アプリケーション、API 連携、官民の業務管理システムの設計・開発を承り、長期的なサポートも提供します。

ソフトウェア開発サービスを見る