Xin chào mọi người, nhân danh một coder non tơ trong ngày hoàn thành task sớm và có một số câu hỏi về Laravel nhưng em/mình nhận ra nếu không có base vững về OOP, OOP trong PHP thì rất khó đào sâu và hiểu được nên em/mình quyết định quay trở lại đọc lại về OOP trong PHP. Sau đây là một số tổng hợp của mình hi vọng moị người đọc và có thể áp dụng được để giải quyết các thắc mắc của mình.
- Ngoài trừ empty và isset chúng ta có thể kiểm tra sự tồn tại của các thuộc tính và phương thức trong class bằng các hàm:
o property_exists(‘Tên class, object’, ‘tên thuộc tính’);
o method_exists(‘Tên class, object’, ‘tên phương thức’);
- Phạm vi truy cập:
o Public: thuộc tính và phương thức có thể được truy cập ở bất cứ đâu.
o Protected: thuộc tính và phương thức chí có thể truy cập ở trong class đó hoặc các class kế thừa lại từ class này.
o Private: thuộc tính và phương thức chỉ có thể truy cập ở bên trong lớp đó.
- Hàm khởi tạo và hàm huỷ (__construct, __destruct)
o __construct: chạy đầu tiên, thường dùng để khởi tạo.
o destruct: chạy cuối cùng, thường dùng để xoá hoặc huỷ tránh việc rò rỉ bộ nhớ
- Sử dụng parrent::method() để gọi đến hàm ở class cha (nếu không các hàm có tên giống nhau sẽ bị ghi đè ở class con)
- Phương thức tính và thuộc tính tĩnh (static) thì có thể truy cập trực tiếp mà không phải tạo đối tượng của class. Một class được coi là tĩnh thì tất cả cả thuộc tính và phương thức của class đó là tĩnh.
o Cách khai báo ví dụ:
public static $name;
protected static $phone;
o Cách gọi:
TenClass::tenphuongthuc();
TenClass::tenthuoctinh;
o Để có thể gọi tới các phương thức và thuộc tính tĩnh trong nội bộ class ta dùng từ khoá ‘self’.
self::propertyName;
self::methodName();
o Nếu gọi phương thức hoặc thuộc tính tĩnh bằng cách ‘static::’ thì sẽ lấy theo Class đang gọi đến phương thức, thuốc tính tĩnh ấy. Khác với dùng ‘self::’ sẽ gọi đến Class chứa phương thức và thuộc tính được gọi:
static::propertyName;
static::methodName();
- Lớp trừu tượng (abstract class)
o Chỉ được phép khai báo và không được có nội dung.
o Phương thức trừu tượng chỉ được khai báo trong lớp trừu tượng.
o Trong lớp trừu tượng có thể có phương thức trừu tượng hoặc không trừu tượng. Nếu là không trừu tượng vẫn có thể triển khai nội dung như bình thường.
o Không có thuộc tính trừu tượng hay hằng số trừu tượng.
o Không thể khởi tạo đối tượng từ lớp trừu tượng.
o Các phạm vi trong lớp trừu tượng chỉ có thể là public và protected.
o Các lớp kế thừa lại lớp trừu tượng phải định nghĩa tất cả các phương thức trừu tượng có trong lớp trừu tượng đó.
- Interface (Interface không phải class hay object mà nó là ‘template’).
o Cũng giống như abstract class thì interface chỉ được khai báo phương thức và không được triển khai nội dung.
o Trong interface không được khai báo thuộc tính (biến) nhưng được phép khai báo hằng số.
o Không thể khởi tạo đối tượng từ interface.
o Để sử dụng interface thì phải khai báo class implement interface đó.
o Class implement interface phải định nghĩa hết tất cả các phương thức của interface đó.
o Một class có thể implement nhiều interface.
o Các interface có thể kế thừa lẫn nhau bằng từ khoá extends.
o Phạm vi trong interface chỉ tồn tại dưới dạng public.
- Khi nào dùng ‘abstract’, khi nào dùng ‘interface’ ?
o Dùng absctract khi :
Chia sẻ các phương thức, thuộc tính, hằng số giữa các lớp trong quan hệ kế thừa.
Muốn class chứa các thành phần phạm vi như public, protected.
Muốn class chứa các phương thức static,…
o Dùng interface khi:
Định nghĩa các chức năng chung, giá trị chung cho các lớp không có mối liên hệ với nhau.
Muốn tận dụng lợi ích của đa kế thừa.
Muốn xác định hành vi mà không cần quan tâm tới class sẽ thực thi.
- Một số magic method độc lạ: __get, __set, __call, __callStatic, …
- Trait giúp chúng ta giải quyết vấn đề đa kế thừa.
o Các khai báo tương tự class chỉ cần thay ‘class’ thành ‘trait’.
o Sử dụng bằng cách từ khoá ‘use’ trong class.
o Nếu có các thuộc tính giống nhau thì trait sẽ bị ghi đè và không sử dụng được parent như extends class.
o Trong trait có thể use trait để tổng hợp các phương thức.
o Nếu 2 trait cùng phương thức với nhau sẽ gây ra lỗi, giải quyết bằng cách xét độ ưu tiên hoặc ghi đè lại trong class.
- Final Class (Class hoàn thành) không cho các class khác kế thừa mình.
- Final method (Phương thức hoàn thành) không cho phép ghi đè phương thức.
Bài viết chủ yếu là những kiến thức cơ bản nhưng nếu không để ý cũng sẽ rất dễ quên và nhầm lẫn. Em cảm ơn mọi người đã đọc bài hi vọng bài viết sẽ có ích với mọi người!!!