Coding practices in PHP.

Giới thiệu:

Rất nhiều PHP developer hiện nay và kể cả phần lớn các framework đều chọn cách viết code theo mô hình lập trình hướng đối tượng. Hôm nay chúng ta sẽ tìm hiểu về những coding practices, convention cần thiết cho lập trình viên để cho code đẹp, code sạch, fix bug dễ dàng hơn.

Tìm hiểu về Composer package manager.

  • Package manager là gì ?

    Giả sử bạn đang làm một dự án, cần sử dụng một số thư viện thay vì tự code. Bạn lên mạng tải thư viện đó về, link vào dự án và bắt đầu chạy. Cách làm này có một số vấn đề:

    • Khi nhiều người cùng làm chung một dự án, đôi khi mỗi người sử dụng một phiên bản riêng, xung đột lẫn nhau. Code chạy được ở máy này, không chạy được ở máy khác.
    • Khi commit code vào source control, ta phải commit cả thư viện vào, rất nhiều và nặng khi commit cũng như tải về.
    • Khi deploy, ta phải copy luôn thư viện lên, rất chậm và mất thời gian.

    Vì vậy chúng ta cần package manager.

Nói đơn giản, Nói đơn giản, Package Manager (PM) hoặc package management system là một tập hợp các phần mềm dùng để quản lý và tự động hoá việc cài đặt, nâng cấp, gỡ bỏ các phần mềm/thư viện (package). (nguồn wikipedia)

  • Composer là gì ?

Composer là công cụ để quả lý package hay library PHP. Composer sẽ cài đặt những libraries vào một thư mục nào đó nằm bên trong project bạn đang làm việc. Nó tương tự như bundler của Ruby, hay npm của Node. Các bạn có thể tham khảo bài viết Tìm hiểu về Composer của anh Trần Đức Thắng để có cái nhìn chi tiết hơn.

Tìm hiểu về các quy tắc trong PSR2

  • PSR là gì? Như các bạn biết là khi lập trình PHP thì mỗi người có một cách viết code khác nhau cũng như cách đặt tên biến khác nhau, do đó khi làm việc nhóm thì cần phải thống nhất style code với nhau, nếu không thì dự án của bạn sau một thời gian sẽ như đống “SHIT”

    Chính vì lẻ đó mà PHP đã ra một tiêu chuẩn về PSR, vậy PSR là gì ? PSR là viết tắt của PHP Special Request, là những tiêu chuẩn khi code PHP, nó được cộng đồng PHP xây dựng và áp dụng theo. Hiện tại có các PSR 1 đến 19 bạn có thể vào trang chủ PHP-FIG để tìm hiểu chi tiết hoặc cũng có thể vào loạt bài viết Chuẩn viết code PHP được viết bằng tiếng việt để dễ hiểu (nhưng không đầy đủ hết 19 phần) 😀

  • Nào giờ mình nói các quy tắc cơ bản trong PSR2:

    • Code PHẢI tuân thủ PSR-1.
    • Code PHẢI sử dụng 4 ký tự space để lùi khối (không dùng tab).
    • Mỗi dòng code PHẢI dưới 120 ký tự, NÊN dưới 80 ký tự.
    • PHẢI có 1 dòng trắng sau namespace, và PHẢI có một dòng trắng sau mỗi khối code.
    • Ký tự mở lớp { PHẢI ở dòng tiếp theo, và đóng lớp } PHẢI ở dòng tiếp theo của thân class.
    • Ký tự { cho hàm PHẢI ở dòng tiếp theo, và ký tự } kết thúc hàm PHẢI ở dòng tiếp theo của thân hàm.
    • Các visibility (public, private, protected) PHẢI được khai báo cho tất cả các hàm và các thuộc tính của lớp.
    • Các từ khóa điều khiển khối (if, elseif, else) PHẢI có một khoảng trống sau chúng, hàm và lớp thì KHÔNG ĐƯỢC làm như vậy.
    • Mở khối { cho cấu trúc điều khiển PHẢI trên cùng một dòng; và đóng khối này } với ở dòng tiếp theo của thân khối.
    • Hằng số true, false, null PHẢI viết với chữ thường.
    • Từ khóa extends và implements PHẢi cùng dòng với class.
    • Implements nhiều lớp, thì mỗi lớp trên một dòng.
    • Keyword var KHÔNG ĐƯỢC dùng sử dụng khai báo property.
    • Tên property KHÔNG NÊN có tiền tố _ nhằm thể hiện thuộc protect hay private.
    • Tham số cho hàm, phương thức: KHÔNG được thêm space vào trước dấu , và PHẢI có một space sau , Các tham số CÓ THỂ trên nhiều dòng, nếu làm như vậy thì PHẢI mỗi dòng 1 tham số.
    • abstract, final PHẢI đứng trước visibility, còn static PHẢI đi sau.
  • Tiêu chuẩn PSR 1 như sau:

  • Các file code PHẢI sử dụng thẻ <?php hoặc <?
    • File code PHP sử dụng encode: UTF-8 without BOOM
    • Các Files NÊN hoặc dùng để khai báo các thành phần PHP (các lớp, hàm, hằng ...) hoặc dùng với mục đích làm hiệu ứng phụ (như include, thiết lập ini cho PHP ...), nhưng KHÔNG NÊN dùng cả 2 cùng lúc trong 1 file
    • Các Namespace và classes PHẢI theo chuẩn "autoloading" PSR: [PSR-0 và PSR-4]
    • Tên lớp **PHẢI **có dạng NameClass (chữ không nameclass, Nameclass, namClass ...)
    • Hằng số trong class tất cả PHẢI viết HOA và chia ra bởi dấu _
    • Tên phương thức của lớp PHẢI ở dạng camelCase (từ đầu viết thường, ví dụ: helloWorld)

Tìm hiểu về PSR0 và PSR 4

  • Tiêu chuẩn PSR-0 chuẩn Autoloading:
    • Một namespace và class đầy đủ điều kiện (fully qualified) PHẢI có cấu trúc như sau <Vendor Name>(<Namespace>)*<Class Name>
    • Mỗi namespace PHẢI có một top-level namespace (“Vendor name” - có thể hiểu là namespace gốc)
    • Mỗi namespace CÓ THỂ có nhiều sub-namespace (namespace con)
    • Mỗi namespace phân biệt được chuyển đến thư mục phân biệt khi load từ hệ thống.
    • Mỗi kí tự _ trong TÊN CLASS được chuyển đến một thư mục riêng biệt. Kí tự _ không có ý nghĩa đặc biệt gì trong namespace.
    • Namespace và class đầy đủ điều kiện có hậu tố .php khi load từ hệ thống
    • Kí tự chữ cái trong Vendor name, namespaces, và class CÓ THỂ là tổ hợp của kí tự thường và hoa.
  • Tiêu chuẩn PSR-4 quy tắc lưu trữ file được load:
    • "Class" ở đây ám chỉ cho classes, interface, traits và những cấu trúc tương tự khác.
    • Tên xác định đầy đủ của 1 "class" có dạng: <NamespaceName>(<SubNamespaceNames>)*<ClassName>
      • Tên xác định đầy đủ PHẢI có một namespace gốc (hiểu là tên vendor).
      • Tên xác định đầy đủ CÓ THỂ có một hoặc nhiều namespace con.
      • Tên đầy đủ nó PHẢI có một tên class kết thúc (ClassName).
      • Kí tự _ không có ý nghĩa đặc biệt trong tên class đầy đủ.
      • Kí tự chữ cái trong tên class đầy đủ CÓ THỂ là tổ hợp của kí tự thường và hoa.
      • Tất cả tên class PHẢI được tham chiếu trong một cách phù hợp.
    • Khi nạp một file thì nó phải tương ứng với một tên xác định đầy đủ của class.
      • Một loạt liên tiếp của 1 hoặc nhiều leading namespace và sub-namespace không bao gồm các dấu phân cách trong tên class đầy đủ (có thể hiểu là "namespace prefix") tương ứng với ít nhất 1 "thư mục cơ sở".
      • Một loạt liên tiếp sub-namespace sau "namespace prefix" tương ứng với 1 thư mục con trong "thư mục cơ sở", mỗi namespace riêng biệt tương ứng với thư mục riêng biệt. Tên thư mục con PHẢI phù hợp với sub-namespace.
      • Tên class kết thúc tương ứng với tên file <ClassName>.php
      • Triển khai tự động nạp PHẢI KHÔNG throw exception, PHẢI KHÔNG gây ra lỗi ở bất kì level, và KHÔNG NÊN trả về giá trị.

Tìm hiểu về PHP CodeSniffer

Cộng đồng đã phát triển rất nhiều công cụ giúp việc code chuẩn trở nên dễ dàng hơn bao giờ hết. Bạn có thể tích hợp với các IDE phổ biến, để nhắc nhở hoặc tự động sửa định dạng code lại giúp bạn. PHP CodeSniffer là công cụ rất mạnh, quét được PHP, JavaScript và CSS.

Nếu bạn muốn tìm hiểu và cách cài đặt bạn có thể theo dõi chi tiết link ở đây.

Trong PHPStorm cũng có hỗ trợ PHP CodeSniffer bạn có thể dùng nhưng vì nó tích hợp nhiều thứ nên nó rất nặng, chạy chậm.

Kết thúc:

Trên đây là tất cả những tiêu chuẩn viết code, và các công cụ hỗ trợ trong việc viết Code mong nó sẽ giúp ích nhiều cho bạn. Xin chào và hẹn gặp lại,😀😀