Trong PHP, cả $thisself đề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.

1. $this trong PHP

$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.

Đặc điểm và cách sử dụng:

  • Tham chiếu đến đối tượng hiện tại: Khi bạn tạo một đối tượng từ một class, $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.
  • Sử dụng để truy cập thuộc tính và phương thức không tĩnh: Với $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

2. self trong PHP

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.

Đặc điểm và cách sử dụng:

  • Truy cập các thuộc tính và phương thức tĩnh: Trong lập trình hướng đối tượng PHP, các thuộc tính và phương thức tĩnh được dùng khi chúng ta muốn có các thành phần không gắn với đối tượng cụ thể, mà gắn với chính class. Khi cần truy cập các thành phần này từ bên trong class, chúng ta sử dụng self:: thay vì $this->.
  • Không yêu cầu tạo đối tượng: Bạn có thể truy cập thuộc tính và phương thức tĩnh trực tiếp thông qua class mà không cần phải tạo instance (đối tượng). Điều này rất hữu ích khi bạn cần một số giá trị hoặc phương thức chung cho tất cả các đối tượng của class đó.

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.

Sự khác biệt giữa selfstatic:

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.

Kết luận:

  • $this: Được sử dụng để tham chiếu tới đối tượng hiện tại trong ngữ cảnh của các phương thức không tĩnh (instance methods). Nó đại diện cho một instance cụ thể của class và cho phép bạn truy cập các thuộc tính, phương thức của đối tượng đó.
  • self: Được sử dụng để truy cập vào các thuộc tính và phương thức tĩnh của class. Nó không yêu cầu phải có đối tượng và luôn tham chiếu tới class nơi nó được định nghĩa.

Việc hiểu và áp dụng đúng $thisself 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.