Đừng nhầm lẫn giữa $this và self trong PHP

CHUYỆN NGHỀNo Comments

You Are Here:Đừng nhầm lẫn giữa $this và self trong PHP

Hôm nay mổ sẻ chút về PHP nhé các bạn. Như chúng ta đã biết trong PHP self đề gọi static function còn this để gọi non-static function.

Ok một ngày đẹp trời bạn tự đặt câu hỏi thế giờ dùng this có gọi được static function không hay là dùng self có gọi được non-static function không. Để giải quyết vấn đề không có cách gì khác ngoài lao vào code đề làm rõ đúng không.

1. $THIS

$This dùng để tham chiếu đến đối tượng (object).

Ví dụ chúng ta có class Car và một class khác Lamborghini kế thừa từ Car. Class Lamborghini sẽ override phương thức whichClass() của class cha. Hãy cùng xem qua cài đặt của 2 class này, đầu tiên ta sẽ dùng $this:

Như đã nói ban đầu this để tham chiếu đến đố i tượng mình nhắc lại là đối tượng nhé.Nên trong ví dụ trên khi ta khởi tạo đối tượng Lamborghini sau đó gọi đến method sayClassName được kế thừa từ class Car, ở đây hàm whichClass() được gọi bởi đối tượng Lamborghini nên kết quả trả về là I am Lamborghini.Nói một cách khác đây chính là ví dụ rất dễ hiểu về tính Đa hình (Polymorphism) trong PHP.

2. Self

Self dùng để truy cập đến chính class đó.

Vẫn là ví dụ trên ta thay đổi một chút nhé.

Điều gì đã khiến output thay đổi vậy. Vâng câu trả lời chính là do self::whichClass(). Như đã nói ở trên bản thân self sẽ biết mình phải gọi phương thức của chính Class chứa nó (tức là gọi hàm whichClass() của class Car.

3. Sử dụng This với static function

Bây giờ chúng ta sẽ đi tìm câu trả lời ở đầu bài nhé. Tiếp tục theo dõi ví dụ sau

 

Thử dự đoán xem điều gì sẽ xảy ra, có thể bạn sẽ nghĩ luôn đến việc báo lỗi trong trường hợp này. Tuy nhiên kết quả không phải như vậy, chúng ta vẫn nhận được kết quả: “I am an Car!”. Bởi vậy, chúng ta có thể gọi static function với từ khóa $this không có vấn đề gì cả.

 

4. Sử dụng this cho thuộc tính static

Tiếp tục xem ví dụ sau. Sao ông lấy lắm ví dụ thế 🙁 Thôi lấy ví dụ thực tế tí nhé.

 

Kết quả là “Di nha nghi”. Vậy là chúng ta kết luận có thể dùng $this để gọi ra thuộc tính static. Khoan kết luận nếu thực sự là như vậy thì class Con gái kia sau khi say rượu trạng thái cũng phải là Di nha nghi ??? Kiểm tra thử coi.

Giả dối, tất cả chỉ là giả dối. Tại sao thằng kia đã tác động đến trạng thái của nó là sau đó bạn gái kia không chấp nhận trạng thái ” Di nha nghi”.

Câu trả lời có là trong thực chất $this không hề làm việc với biến static kia mà PHP sẽ tự tạo ra một biến mới là trangthai với kiểu none-static(nếu chưa có) trong class ConGai. Vậy là chỉ là chúng ta cảm giác đang làm việc với biến static trangthai thôi. Mà cái gì mập mờ quá thì không nên làm đúng không. Người yêu mà cứ mập mờ thì next đi :D.

5. Tổng kết

Thông qua các ví dụ cụ thể hết sức thú vị, chúng ta đã hiểu hơn chút về self và $this cũng như cách sử dụng chúng. Ta sẽ tổng hợp lại thông qua bảng so sánh sau:

self $this
Tham chiếu đến Class hiện tại Tham chiếu đến đối tượng (Object) hiện tại
Dùng để gọi các hàm static và tham chiếu đến các thuộc tính static Có thể dùng để gọi các hàm static
Có thể dùng trong các hàm static (để truy cập đến các hàm hay thuộc tính static khác của Class) Không nên dùng để gọi các thuộc tính static (vì sẽ không truy cập được mà lại tự tạo ra các thuộc tính non-static của đối tượng), nên dùng self trong trường hợp này.
Khi được sử dụng sẽ ngăn chặn thể hiện của tính đa hình bằng việc bỏ qua vtable Không thể sử dụng được trong các hàm static

Bài viết được tham khảo từ:
https://viblo.asia/p/so-sanh-self-va-this-trong-php-qm6RWQWyGeJE

https://stackoverflow.com/questions/151969/when-to-use-self-over-this

About the author:

Top