Thời gian đọc: 7 phút
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:
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
và $model
của đối tượng $car
.
$this
:$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.$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.$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
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ụ:
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.
self
: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.$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.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
.
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.