Hướng dẫn php this vs self
Bài viết này được dịch từ nguồn in PHP, what is the difference between self and $this? nên các ví dụ thực tế tôi xin phép được giữ nguyên từ tác giả. Show Giới thiệuKhi chúng ta làm việc với PHP, cụ thể là các PHP Framework, bạn đã từng đọc vào core của framework đó? Bạn đã từng nghe về từ khóa Bạn đã bao giờ tự đặt câu hỏi dùng Nhìn chung, bạn có thể hiểu rằng Tôi sẽ đưa cho các bạn một ví dụ để dễ hình dung. Chúng ta có class Animal và một class khác Tiger kế thừa từ Animal. Class Tiger sẽ override phương thức
Ta thấy rằng ở
phương thức
Lý do hết sức đơn giản, con trỏ Sử dụng self thay cho $thisHãy cùng thử thay đổi phương thức Có thể bạn quan tâm
Về cơ bản ví dụ vẫn vậy chỉ thay đổi hết sức nhỏ. Ta sẽ thấy điều kỳ diệu xảy ra, kết quả chúng ta nhận được hoàn toàn khác với kết quả bên trên:
Điều gì đã xảy ra? Khi sử dụng $this và self trong ngữ cảnh static functionCâu hỏi đặt ra: Hãy cùng tìm câu trả lời thông qua một ví dụ cài đặt sau:
Kết quả nhận được:
Lỗi này xảy ra vì chúng ta đang sử dụng con trỏ
Nếu ta gọi kiểu này thì việc sử dụng con trỏ Tiếp tục với việc thay sử dụng
Đoạn code trên chạy ngon mà không hề có lỗi. Đây chính là lý do chính mà
Kết quả nhận được:
Lỗi xảy ra do thành phần non-static sẽ không được phép truy cập trong một static function. Có thể hiểu đơn giản là static function có thể được gọi mà không cần đối tượng từ class, những thành phần non-static thì lại cần đối tượng của class. Khái niệm này được base trên ý tưởng từ C++, các bạn muốn tìm hiểu sâu hơn có thể đọc thêm tại Accessing non static members from a static function. $this và self khi truy cập những thuộc tính static và các hàm staticTương tác với hàm staticHãy cùng xem ví dụ cài đặt sau:
Chúng ta sử dụng
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 Animal!". Bởi vậy, chúng ta có thể gọi static function với từ khóa Tương tác với các thuộc tích static trong ClassSử dụng |
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 |
Hy vọng bài dịch và có chém gió thêm chút sẽ giúp các bạn hiểu hơn về self
và $this
.
Tài liệu tham khảo
- http://www.programmerinterview.com/index.php/php-questions/php-self-vs-this/