Dành cho dân PHP: Bí quyết để hết đau đầu vì phân tích mã nguồn

Sau một thời gian dài vắng bóng, tác giả của chuỗi bản tin PHP đầy sức hút trên Sun* News đã quay trở lại. Lần này chúng ta sẽ cùng phân tích về Static Code Analysis và một số tool thông dụng trong project PHP. Và tất nhiên, hàng loạt thông tin 'hot' nhất về PHP trong 2 tháng qua cũng được liệt kê rất chi tiết.

Static code analysis là gì?

Static code analysis (SCA) là việc thực hiện phân tích mã nguồn để đảm bảo về convention của dự án, hay để đánh giá chất lượng, tìm ra các lỗi tiềm ẩn hoặc lỗi thường gặp mà không phải chạy source code đó. 

Việc này cũng gần tương tự với compile mã nguồn đối với các ngôn ngữ dạng biên dịch như C/C++, Go, Java,... Tuy nhiên, với một ngôn ngữ thông dịch như PHP, bước compile này mặc định không có. Cách thức hoạt động của SCA là đọc và phân tích cấu trúc của bộ mã nguồn, sau đó đối chiếu với các quy tắc đã được đề ra để xem có vi phạm lỗi nào hay không. 

SCA thường được áp dụng khi test tự động trên các hệ thống Continuous Integration (CI) trong quá trình build, merging code và deploy; hay tích hợp vào IDE (PHPStorm), code editor (VSCode, Sublime Text, Atom,...) nhằm hỗ trợ dev viết code tự tin hơn.

Hiện nay, hầu hết các project PHP tại Sun* đều đã được áp dụng CI thông qua việc chạy các tool SCA, unit test. Bên cạnh đó, chúng ta hoàn toàn có thể chủ động tự ứng dụng các tool này trước và tự tin có dấu tích xanh. Sẽ không còn nỗi lo lắng "CI failed".

Static code analysis tools

  1. PHP_CodeSniffer

Tool phổ biến và thiết yếu nhất có lẽ là PHP_CodeSniffer (phpcs), giúp đảm bảo convention của dự án. Nó cung cấp 2 công cụ chính:

  • PHPCS: được dùng để tìm ra những lỗi sai coding convention
  • PHPCBF: tự động fix một lỗi convention

Tại Sun* cũng có một bộ quy tắc coding convention mở rộng cho PHP được viết như là một standard của PHPCS. Gần đây, chúng ta vừa có một vài thay đổi về cách cài đặt standard nói trên cho PHPCS. Sunners có thể cài trực tiếp cho từng project thay vì phải cài PHPCS globally, chi tiết đã được cập nhật tại đây

2. PHP Coding Standards Fixer

PHP Coding Standards Fixer (php-cs-fixer) được dùng để fix tự động các lỗi convention thường gặp với tính năng ương tự với tool PHPCBF ở trên, nhưng hoạt động tốt hơn. Có thể bạn đã từng thấy file .php_cs trong folder dự án, đây chính là file cấu hình (xem ví dụ tại đây).

3. PHPMess Detector

PHP Mess Detector (phpmd) có thể phát hiện ra rất nhiều vấn tiềm tàng trong mã nguồn như:

  • Phát hiện lỗi tiềm ẩn.
  • Tối ưu code.
  • Phát hiện các đoạn code quá phức tạp.
  • Phát hiện các tham số thừa, thuộc tính, phương thức không được sử dụng đến.

4. PHP Copy/Paste Detector

PHP Copy/Paste Detector (phpcpd) được dùng để phát hiện những đoạn code trùng lặp trong các file, hay nghi vấn là do copy / paste từ file này sang file khác, có thể vi phạm nguyên tắc DRY.

Ngoài ra, có 2 tool được nhắc đến rất nhiều trong thời gian gần đây đó là PHPStanPsalm với các chức năng như:

  • Kiểm tra syntax
  • Kiếm tra sự tồn tại của classes, methods, functions và constants
  • Kiểm tra sự tồn tại của biến
  • Kiểm tra tham số hoặc biến không được dùng đến
  • Kiểm tra đúng kiểu dữ liệu (strict type)

Xem thêm danh sách các tool khác tại đây.

Với các tool này, bạn hoàn toàn có thể sử dụng trước khi đẩy code lên CI. Việc này có thể được làm thủ công hoặc tích hợp vào IDE, Code Editor hay sử dụng git hooks để check trước khi commit hoặc trước mỗi khi push code lên remote repository (Với PHP project có thể sử dụng https://github.com/captainhookphp/captainhook để tích hợp git hook bằng composer).

Các công cụ, thư viện mới releases

Cùng tìm hiểu qua một số công cụ, thư viện được ra mắt hoặc release phiên bản mới trong thời gian gần đây:

  • PHP 8.0.0 RС 2: Bản release candidate cho PHP 8. Sẽ có ít nhất 2 bảng release candidates nữa trước khi release bản final. Tham khảo thêm các bài viết giới thiệu về các features mới trong PHP 8 như: What’s new in PHP 8 PHP 8: before and after và series bài viết Series PHP 8.0 feature focusPHP.Watch.
  • Composer 2.0: Phiên bản Composer 2.0 chính thức được release với cải thiện đáng kể đợi về performance, tốc độ download, install packages
  • Doctrine/dbal: Database Abstraction Layer. Major release version 3.0 có nhiều cải thiện về API, cùng với việc xóa các API đã deprecated trước đây và bỏ support một số version database system cũ.
  • Shivammathur/setup-php: Package hỗ trợ việc setup PHP trong Github Action release version 2.8
  • Xdebug 3.0: Công cụ debug PHP release version 3 với thêm một setting cho php.ini xdebug.mode, cải thiện đáng kể về performance và support PHP 8.
  • arkrogoyski/math-php: Thư viện toán học cho PHP
  • marcocesarato/PHP-Antimalware-Scanner: Công cụ scan PHP files và tìm nếu có malicious code không.
  • PHPBench: PHP Benchmarking framework
  • Bolt 4.0: CMS được built bằng Symfony 5, hỗ trợ đầy đủ REST, GraphQL API và i18n
  • Ksassnowski/venture: Laravel package hỗ trợ tạo workflow từ queue jobs.

Loạt bài viết về PHP đáng chú ý trong 2 tháng qua

  • I scream, you scream, we all scream for @ [https://www.exakat.io]
    Bài viết nói về PHP Error Control Operators @ và giải thích tại sao không nên lạm dụng nó
  • Laravel & PHP Guidelines [https://spatie.be]
    Tham khảo guidelines về Laravel và PHP của công ty Spatie - công ty có rất nhiều đóng góp cho Laravel và nhiều Laravel packages hữu ích chúng ta đang sử dụng.
  • The complete guide to Laravel front-end scaffolding [https://samuelstancl.me]
    Kể từ Laravel 6 với việc tách command php artisan make:auth ra package mới, và sự ra đời của hàng loạt các package như Laravel Jetstream, Laravel Sanctum, Laravel Fortify, Laravel Breeze đã gây ra rất nhiều nhầm lẫn, khó hiểu trong cộng đồng Laravel. Bài viết này nhằm mục đích giúp người đọc hiểu hơn về Laravel front-end scaffolding.
  • Caching makes everything faster. Right?[https://thephp.cc]
    Bài viết từ tác giả của PHPUnit (Sebastian Bergmann) về cách ông thực hiện caching cho chức năng code coverage của PHPUnit, tại sao không hoạt động như mong đợi và cách giải quyết vấn đề đó.
  • Viblo Editor Choices [https://viblo.asia]
    Tập hợp các bài viết đáng chú ý từ Viblo, đừng bỏ qua.
  • Modern PHP Cheat Sheet [https://front-line-php.com]: Tập hợp cách cheat sheet ngắn gọn về cú pháp PHP, bao gồm cả các cú pháp mới trong PHP 8

Những video giá trị về PHP

Dưới đây là một số video đáng chú ý trong các sự kiện, hội nghị thường niên về PHP trong năm 2020:

  • PHP Vegas October Meetup - PHP Security and Accessing Databases 101: Video nói về 10 lỗ hổng bảo mật OWASP trong PHP và một số điểm bạn cần cân nhắc khi sử dụng PHP-FPM; kèm theo chủ đề về việc access databases trong PHP bằng vanilla PHP.
  • Profiling PHP Applications with Xdebug: Video hướng dẫn thực hiện profile PHP app bằng Xdebug, kết hợp với cáo tool profiling front-end như qcachegrind để visualise call graphs và tìm những điểm nút cổ chai bottlenecks có thể gây ảnh hưởng đến performance.
  • Laravel Jetstream discussions: Video streaming của Laravel creator Taylor Otwell về Laravel Jetstream.

Hi vọng bài viết sẽ mang đến cho Sunners nhiều thông tin hữu ích. Hãy để lại comment và cùng nhau thảo luận nhé!

#PHP