Coding convention là tập hợp những quy ước cụ thể khi viết code mà lập trình viên cần tuân theo. Việc tuân thủ những quy ước này sẽ giúp code dễ đọc, dễ quản lý.bảo trì, nâng cấp.
Tùy công ty sẽ có những quy chuẩn coding convention khác nhau nhưng hầu hết sẽ dựa trên các chuẩn phổ biến trên thế giới.
PHP có một chuẩn viết code là PSR. PSR là viết tắt của từ PHP Standards Recommendation. Hiện tại thì có 5 chuẩn từ PSR-0 đến PSR-4 và 2 chuẩn phổ biến nhất đó là PSR1 và PSR2:
Cú pháp: Ký tự đầu tiên của từ đầu tiên viết thường, những ký tự đầu tiên của những từ tiếp theo viết hoa.
Ví dụ: productName, productPrice, thisIsTheNameFollowTheCamelCase
Cú pháp: viết hoa chữ cái đầu tiên của mỗi từ.
Ví dụ: ProductName, ProductPrice, ThisIsTheNameFollowThePascalCase
Cú pháp: Tất cả các chữ cái đều viết thường, và các từ cách nhau bởi dấu gạch dưới. Ví dụ: product_name, product_price, this_is_the_name_follow_the_snake_case
Tuỳ vào mỗi ngôn ngữ lập trình và cộng đồng định nghĩa, ta sẽ lựa chọn cú pháp phù hợp.
Số lượng dòng code trong hàm/lớp, số lượng hàm trong lớp, số lượng lớp trong gói phải giữ ở một giới hạn nhất định, và nên giữ càng ít càng tốt.
Đây là các chuẩn dùng để viết code, có một vài quy tắc đơn giản như sau:
PHP Code Sniffer (hay còn gọi là phpcs) là một cộng cụ phục vụ lập trình viên trong việc check các coding convention.
PHP Code Sniffer bao gồm 2 tập lệnh PHP:
Đây là 1 công cụ phát triển thiết yếu để đảm bảo mã của bạn sạch sẽ, tuân thủ các coding convention mà bạn không phải mất thời gian rà soát lại code để check.
Package: https://packagist.org/packages/squizlabs/php_codesniffer
Sử dụng:
$ ./vendor/bin/phpcs -i The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1 and PSR12 $ ./vendor/bin/phpcs -h $ ./vendor/bin/phpcbf -h
Chuẩn PEAR là chuẩn mặc định mà PHP Code Sniffer dùng để kiểm tra.
Kiểm tra 1 file có tuân thủ chuẩn PEAR hay không:
$ ./vendor/bin/phpcs src/Commands/ModuleMakeCommand.php FILE: /Sources/Packages/laravel-module/src/Commands/ModuleMakeCommand.php -------------------------------------------------------------------------------------------------------------------- FOUND 57 ERRORS AND 27 WARNINGS AFFECTING 79 LINES -------------------------------------------------------------------------------------------------------------------- 2 | ERROR | [ ] Missing file doc comment 11 | ERROR | [x] There must be exactly one blank line before the tags in a doc comment 12 | ERROR | [ ] Missing @category tag in class comment 12 | ERROR | [ ] Missing @author tag in class comment 12 | ERROR | [ ] Missing @license tag in class comment 12 | ERROR | [ ] Missing @link tag in class comment
Kiểm tra toàn bộ thư mục:
TungNT:laravel-module tungnt$ sudo ./vendor/bin/phpcs src/ FILE: /Sources/Packages/laravel-module/src/Stubs/configs/example.stub.php ------------------------------------------------------------------------- FOUND 1 ERROR AFFECTING 1 LINE ------------------------------------------------------------------------- 2 | ERROR | Missing file doc comment -------------------------------------------------------------------------
Kiểm tra theo chuẩn khác, sử dụng –standard. Ví dụ:
TungNT:laravel-module tungnt$ sudo ./vendor/bin/phpcs --standard=PSR2 src/ FILE: /Sources/Packages/laravel-module/src/Stubs/configs/example.stub.php ------------------------------------------------------------------------- FOUND 1 ERROR AFFECTING 1 LINE ------------------------------------------------------------------------- 5 | ERROR | [x] Expected 1 newline at end of file; 0 found ------------------------------------------------------------------------- PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY -------------------------------------------------------------------------
Tự động sửa các vi phạm Theo chuẩn:
$ ./vendor/bin/phpcbf --standard=PSR2 src/ PHPCBF RESULT SUMMARY -------------------------------------------------------------------------------------------- FILE FIXED REMAINING -------------------------------------------------------------------------------------------- /Sources/Packages/laravel-module/src/Stubs/configs/example.stub.php 1 0 /Sources/Packages/laravel-module/src/ModuleGeneratorServiceProvider.php 3 0 -------------------------------------------------------------------------------------------- A TOTAL OF 4 ERRORS WERE FIXED IN 2 FILES -------------------------------------------------------------------------------------------- Time: 129ms; Memory: 6MB $ vendor/bin/phpcs --standard=ruleset.xml tests/ FILE: /Sources/Packages/codesniffer/tests/helpers.php ----------------------------------------------------------------------- FOUND 0 ERRORS AND 3 WARNINGS AFFECTING 3 LINES ----------------------------------------------------------------------- 10 | WARNING | Line longer than 80 characters; contains 94 characters 21 | WARNING | Line longer than 80 characters; contains 99 characters 32 | WARNING | Line longer than 80 characters; contains 90 characters ----------------------------------------------------------------------- Time: 103ms; Memory: 6MB $ vendor/bin/phpcs --standard=src/Standards/OneSite/ tests/
Config Standars:
TungNT:codesniffer tungnt$ vendor/bin/phpcs --standard=OneSite tests/ ERROR: the "OneSite" coding standard is not installed. The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1 and PSR12 TungNT:codesniffer tungnt$ sudo ./vendor/bin/phpcs --config-show Password: Using config file: /Sources/Packages/codesniffer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf TungNT:codesniffer tungnt$ sudo ./vendor/bin/phpcs --config-set installed_paths src/Standards/OneSite/ Using config file: /Sources/Packages/codesniffer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf Config value "installed_paths" added successfully TungNT:codesniffer tungnt$ sudo ./vendor/bin/phpcs --config-show Using config file: /Sources/Packages/codesniffer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf installed_paths: src/Standards/OneSite/ TungNT:codesniffer tungnt$ cat /Sources/Packages/codesniffer/vendor/squizlabs/php_codesniffer/CodeSniffer.conf <?php $phpCodeSnifferConfig = array ( 'installed_paths' => 'src/Standards/OneSite/', ) ?>TungNT:codesniffer tungnt$ vendor/bin/phpcs -i The installed coding standards are PEAR, Zend, PSR2, MySource, Squiz, PSR1, PSR12 and OneSite TungNT:codesniffer tungnt$ sudo ./vendor/bin/phpcs --config-delete src/Standards/OneSite/ TungNT:codesniffer tungnt$ ./vendor/bin/phpcs --standard=OneSite tests/ FILE: /Sources/Packages/codesniffer/tests/helpers.inc ----------------------------------------------------------------------- FOUND 2 ERRORS AFFECTING 2 LINES ----------------------------------------------------------------------- 8 | ERROR | Variable "_suffix" must not contain a leading underscore 10 | ERROR | Variable "_suffix" must not contain a leading underscore ----------------------------------------------------------------------- Time: 72ms; Memory: 6MB