Trong PHP, cả $this
và self
đều là các từ khóa quan trọng được sử dụng trong lập trình hướng đối tượng, nhưng chúng có những điểm khác biệt lớn về cách thức hoạt động và ngữ cảnh sử dụng. Việc hiểu rõ sự khác biệt giữa chúng là rất quan trọng để có thể phát triển mã một cách hiệu quả và đúng chuẩn. Dưới đây là sự phân tích chi tiết hơn về hai từ khóa này, giúp bạn hiểu rõ hơn.
$this
là từ khóa đặc biệt trong PHP, được sử dụng bên trong các phương thức (methods) của một class để tham chiếu đến đối tượng hiện tại đang được gọi. Nó đại diện cho instance (thể hiện) cụ thể của class mà bạn đang thao tác.
$this
sẽ đại diện cho đối tượng cụ thể đó trong mọi phương thức của class. Điều này có nghĩa là $this
chỉ khả dụng trong ngữ cảnh của một đối tượng (object), và nó không hoạt động với các phương thức hoặc thuộc tính tĩnh.$this
, bạn có thể truy cập và sửa đổi các thuộc tính và phương thức của đối tượng hiện tại. Điều này bao gồm cả những phương thức có thể được gọi từ các class con (subclass) khi sử dụng kế thừa (inheritance).Ví dụ đơn giản:
$this
self
là từ khóa đặc biệt được sử dụng trong các class để truy cập vào các thành viên tĩnh (static properties và static methods) của class hiện tại. Nó không đại diện cho đối tượng cụ thể mà đại diện cho class nơi nó được sử dụng.
self::
thay vì $this->
.Ví dụ:
self
Trong ví dụ trên, khi gọi callWhoAmI()
từ class con ChildClass
, kết quả vẫn là “I am the parent” vì self
trong phương thức callWhoAmI()
tham chiếu tới class nơi nó được định nghĩa, tức là ParentClass
, không phải ChildClass
.
self
và static
:Một điều quan trọng cần lưu ý là self
luôn tham chiếu tới class hiện tại nơi nó được định nghĩa, trong khi static
có thể tham chiếu tới class nơi phương thức thực sự được gọi. Đây là khái niệm về late static binding trong PHP.
Ví dụ:
class ParentClass { public static function whoAmI() { return static::class; } } class ChildClass extends ParentClass { } echo ParentClass::whoAmI(); // Output: ParentClass echo ChildClass::whoAmI(); // Output: ChildClass (dùng static)
Ở đây, static::class
sử dụng late static binding và tham chiếu tới class gọi thực sự, tức là ChildClass
, thay vì ParentClass
.
Việc hiểu và áp dụng đúng $this
và self
sẽ giúp bạn phát triển các ứng dụng hướng đối tượng mạnh mẽ và hiệu quả hơn trong PHP.