Xem phần 1 tại đây
Trait
PHP là ngôn ngữ chỉ hỗ trợ đơn kế thừa trong hướng đối tượng thế nên bạn muốn sử dụng lại source code một cách nhiều lần là rất khó khăn. Và để khắc phục điều đó thì từ PHP 5.4 trở lên, PHP đã hỗ trợ chúng ta Traits
. Một khái niệm được dùng rất là nhiều trong các framework PHP hiện nay, điển hình là Laravel.
Trait
là gì?Trait
là một module giúp cho chúng ta có thể sử dụng lại các phương thức được khai báo trong trait
vào các class khác nhau một cách đơn giản hơn là kế thừa như trước.Trait
có chức năng gom lại các phương thức và thuộc tính mà chúng ta muốn sử dụng lại nhiều lần.abstract class
( đều không thể khởi tạo được) nhưng không hoàn toàn giống nhau.Trait
có thể bị override
lại trong class sử dụng nó.Trait
:
DRY
– Don’t Repeat Yoursefl).Trait
: Nhược điểm duy nhất mà mình thấy được khi sử dụng traits
đó là sẽ gây khó khăn có chúng ta đọc được các phương thức từ một class có sử dụng trait
.Namespaces
(không gian tên)Namespace
là một cơ chế cho phép chúng ta phân nhóm các thực thể như class, object, function thành những nhóm riêng biệt, mỗi nhóm đó được đặt cho một cái tên.Namespace
sẽ để tránh xung đột khi sử dụng nhiều thư viện, trong code có các class với tên giống nhau.Namespace
có thể hiểu đơn giản như là thư mục trên các hệ điều hành, để phân cấp và phân biệt các thực thể có tên giống nhau.magic functions
Magic functions
là các hàm đặc biệt được tự động thực thi khi thực hiện một số hành động nhất định lên đối tượng của class đó. Magic functions
luôn có dạng __
.
Ưu điểm của Magic functions
:
Nhược điểm: Một magic functions
có tốc độ chậm hơn các phương thức bình thường.
Một số Magic functions
:
__construct()
: Thực hiện khi khởi tạo đối tượng.__destruct()
: Thực hiện khi hủy bỏ đối tượng.__get()
, __set()
, __unset()
: Khi cố gắng truy cập, thay đổi, xóa thuộc tính không có sẵn trong đối tượng.__call()
, __callStatic()
: Khi gọi hàm không có sẵn.__toString()
: Thực hiện khi được sử dụng như string.__invoke()
: Khi đối tượng được sử dụng như một hàm.__sleep()
, __awake()
: Khi gọi hàm serialize, unserialize lên đối tượng.__clone()
: Khi clone đối tượng.__set_state()
, __debugInfo()
: Khi gọi var_export
, var_dump
lên đối tượng.namespace
, và PHẢI có một dòng trắng sau mỗi khối code.{
PHẢI ở dòng tiếp theo sau tên class, và đóng lớp }
PHẢI ở dòng tiếp theo của thân class.{
cho hàm PHẢI ở dòng tiếp theo sau tên hàm, và ký tự }
kết thúc hàm PHẢI ở dòng tiếp theo của thân hàm.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.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.{
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.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.var
KHÔNG ĐƯỢC dùng sử dụng khai báo property
.property
KHÔNG NÊN có tiền tố _ nhằm thể hiện thuộc protect
hay private
.,
và PHẢI có một space sau ,
.abstract
, final
PHẢI đứng trước visibility, còn static
PHẢI đứng sau.switch case
thì case
phải lùi 4 khoảng trắng so với switch
, và các lệnh trong case
cũng phải lùi 4 khoảng trắng so với case
. Phải có từ khóa break
hoặc return
, trong trường hợp nào không có thì phải comment //no break
.Tiêu chuẩn PSR-1 chuẩn cơ bản:
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 được 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
).
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 \\(\)*
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: \(\)*\
.
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 .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ị.
Nguồn: Devmaster và internet