Lập trình hướng đối tượng với PHP và những điều cần biết (Phần 2)
Bài đăng này đã không được cập nhật trong 8 năm
Mục lục
- Phần 1: Lập trình hướng đối tượng với PHP và những điều cần biết (Phần 1)
- Các đặc điểm cơ bản của lập trình hướng đối tượng. Chúng được thể hiện như thế nào trong PHP.
- Sự khác biệt giữa Abstract Class và Interface.
- Thế nào là một hàm static. Phân biệt cách dùng từ khoá static::method() với self::method().
- Phần 2: Lập trình hướng đối tượng với PHP và những điều cần biết (Phần 2)
4. Thế nào là Trait5. Thế nào là Namespaces6. Thế nào là magic functions7. Tìm hiểu về các quy tắc trong PSR2 - Phần 3: Lập trình hướng đối tượng với PHP và những điều cần biết (Phần 3) 8. Các phương pháp thiết kế hướng đối tượng (SOLID).
Nội dung
4. Thế nào là 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ì?
Traitlà 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 trongtraitvào các class khác nhau một cách đơn giản hơn là kế thừa như trước.- Các đặc điểm của Traits:
Traitcó 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.- Traits như một
abstract class( đều không thể khởi tạo được) nhưng không hoàn toàn giống nhau. - Các phương thức trong
Traitcó thể bịoverridelại trong class sử dụng nó.
- Ưu điểm của
Trait:- Giảm việc lặp code đáp ứng được nguyên tắc (
DRY- Don't Repeat Yoursefl). - Khắc phục được điểm yếu đơn kế thừa của PHP.
- Giảm việc lặp code đáp ứng được nguyên tắc (
- Nhược điểm của
Trait: Nhược điểm duy nhất mà mình thấy được khi sử dụngtraitsđó 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ụngtrait.
Khai báo và sử dụng trait.
Để khai báo một trait trong PHP các bạn sử dụng cú pháp:
trait TraitName
{
public function methodTrait($param)
{
// TODO
}
}
Bạn cũng có thể sử dụng trait lồng nhau.
trait A
{
//TODO
}
trait B
{
use A;
// TODO
}
Để sử dụng trait trong class thì các bạn chỉ cần sử dụng cú pháp:
class ClassName
{
use TraitName;
//TODO
}
5. Thế nào là Namespaces (không gian tên).
Namespacelà 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.- Việc dùng
Namespacesẽ để 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. Namespacecó 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.
6. Thế nào là 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 __<method_name>.
Ưu điểm của Magic functions:
- Giúp cho chúng ta tùy biến được các hành vi.
- Nó giúp cho chúng ta có thể khởi tạo một đối tượng theo cách mình muốn.
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ọivar_export,var_dumplên đối tượng.
7. Tìm hiểu về các quy tắc trong PSR2
Code theo chuẩn PSR2 phải tuân thủ các quy tắc sau
- 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 sau tên class, 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 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. - 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
extendsvàimplementsPHẢi cùng dòng với class. Implementsnhiều lớp, thì mỗi lớp trên một dòng.- Keyword
varKHÔNG ĐƯỢC dùng sử dụng khai báoproperty. - Tên
propertyKHÔNG NÊN có tiền tố _ nhằm thể hiện thuộcprotecthayprivate. - 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,finalPHẢI đứng trước visibility, cònstaticPHẢI đứng sau.- Phải có 1 khoảng trắng trước và sau phép toán, khi ép kiểu thì phải có 1 khoảng trắng ngăn cách giữa kiểu dữ liệu và biến được ép kiểu.
- Đối với khối lệnh
switch casethìcasephải lùi 4 khoảng trắng so vớiswitch, và các lệnh trongcasecũng phải lùi 4 khoảng trắng so vớicase. Phải có từ khóabreakhoặcreturn, trong trường hợp nào không có thì phải comment//no break.
Các quy tắc liên quan
Tiêu chuẩn PSR-1 chuẩn cơ bản:
- Các file code PHẢI sử dụng thẻ
<?phphoặ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
NamespacevàclassesPHẢI theo chuẩn "autoloading" PSR: [PSR-0 và PSR-4]. - Tên lớp PHẢI có dạng
NameClass(chứ không đượcnameclass,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
namespacevàclassđầy đủ điều kiện (fully qualified) PHẢI có cấu trúc như sau\<Vendor Name>\(<Namespace>\)*<Class Name> - Mỗi
namespacePHẢI có một top-level namespace ("Vendor name" - có thể hiểu là namespace gốc) - Mỗi
namespaceCÓ THỂ có nhiềusub-namespace(namespacecon) - Mỗi
namespacephâ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ì trongnamespace. Namespacevà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àclassCÓ 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,traitsvà những cấu trúc tương tự khác. - Tên xác định đầy đủ của 1
classcó dạng:\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>.- Tên xác định đầy đủ PHẢI có một
namespacegốc (hiểu là tên vendor). - Tên xác định đầy đủ CÓ THỂ có một hoặc nhiều
namespacecon. - 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.
- Tên xác định đầy đủ PHẢI có một
- 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
namespacevàsub-namespacekhô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
namespaceriê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ị.
- Một loạt liên tiếp của 1 hoặc nhiều leading
Kết luận
Mình xin kết thúc phần 2 tại đây, cảm ơn bạn đã theo dõi bài viết, có một số điều khá cần thiết khi lập trình hướng đối tượng với PHP mình đã viết ở phần 1. Và sẽ còn phần 3, phần này sẽ nói đến phuơng pháp thiết kế SOLID rất phổ biến trong lập trình hướng đối tượng. Rất mong sự theo dõi và ủng hộ của các bạn.
All rights reserved