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:

class Car {
    public $brand;
    public $model;

    public function setBrand($brand) {
        $this->brand = $brand;  // Tham chiếu đến đối tượng hiện tại
    }

    public function setModel($model) {
        $this->model = $model;
    }

    public function getDescription() {
        return "This car is a " . $this->brand . " " . $this->model;
    }
}

$car = new Car();  // Tạo một đối tượng mới
$car->setBrand('Toyota');
$car->setModel('Camry');
echo $car->getDescription();  // Output: This car is a Toyota Camry

Trong ví dụ trên, $this giúp chúng ta truy cập và thay đổi giá trị của các thuộc tính $brand$model của đối tượng $car.

Tính chất của $this:

  • Chỉ khả dụng trong các phương thức không tĩnh: $this không thể được sử dụng trong các phương thức tĩnh (static methods) vì phương thức tĩnh không gắn liền với bất kỳ đối tượng nào. Nó chỉ hoạt động với các instance của class.
  • Truy cập thành viên từ các lớp con: Khi bạn sử dụng kế thừa (inheritance) trong PHP, $this vẫn có thể được sử dụng để truy cập các thành viên của class cha (parent class) từ class con.

Ví dụ về sử dụng $this với kế thừa:

class Vehicle {
    public $type = "Generic vehicle";

    public function getType() {
        return $this->type;
    }
}

class Car extends Vehicle {
    public function describe() {
        return "This is a " . $this->getType();
    }
}

$myCar = new Car();
echo $myCar->describe();  // Output: This is a Generic vehicle

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ụ:

class MathUtils {
    public static $pi = 3.14159;

    public static function areaOfCircle($radius) {
        return self::$pi * $radius * $radius;  // Sử dụng self để truy cập thuộc tính tĩnh
    }
}

// Truy cập trực tiếp mà không cần tạo đối tượng
echo MathUtils::areaOfCircle(5);  // Output: 78.53975

Trong ví dụ trên, self được sử dụng để truy cập vào thuộc tính tĩnh $pi và phương thức tĩnh areaOfCircle() của class MathUtils. Bạn không cần phải khởi tạo đối tượng để sử dụng phương thức này, vì nó là phương thức tĩnh.

Tính chất của self:

  • Chỉ áp dụng cho class hiện tại: self luôn tham chiếu tới class mà phương thức tĩnh hoặc thuộc tính tĩnh đang được sử dụng. Điều này có nghĩa là nếu class con kế thừa class cha, thì việc sử dụng self trong class con sẽ không tham chiếu tới các phương thức hay thuộc tính của class cha, mà chỉ trong class con.
  • Không liên quan đến đối tượng: Khác với $this, self không liên quan tới đối tượng cụ thể mà chỉ liên quan tới class hiện tại.

Ví dụ về sự khác biệt với kế thừa:

class ParentClass {
    public static function whoAmI() {
        return "I am the parent";
    }

    public static function callWhoAmI() {
        return self::whoAmI();  // Gọi phương thức tĩnh từ class hiện tại
    }
}

class ChildClass extends ParentClass {
    public static function whoAmI() {
        return "I am the child";
    }
}

echo ParentClass::callWhoAmI();  // Output: I am the parent
echo ChildClass::callWhoAmI();   // Output: I am the parent

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.