Trong PHP, self
và $this
là hai từ khóa có vai trò quan trọng trong lập trình hướng đối tượng, nhưng chúng có cách sử dụng và ý nghĩa khác nhau. Dưới đây là sự khác biệt cơ bản giữa hai từ khóa này:
self
self
được dùng để truy cập các thuộc tính và phương thức tĩnh (static properties và static methods) trong cùng một lớp.self
dùng để chỉ chính lớp hiện tại tại thời điểm biên dịch, không liên quan đến bất kỳ đối tượng nào. Điều này có nghĩa là self
chỉ có thể được sử dụng để gọi các thành viên tĩnh, không thể truy cập các thuộc tính hoặc phương thức không tĩnh.Ví dụ:
class Example { public static $name = "PHP"; public static function getName() { return self::$name; // sử dụng self để gọi biến static } } echo Example::getName(); // Output: PHP
self
chỉ tham chiếu đến lớp hiện tại, nó không thể được dùng để truy cập các thuộc tính hoặc phương thức không tĩnh trong lớp mà cần có một đối tượng để tham chiếu.$this
$this
là một tham chiếu đến đối tượng hiện tại của lớp và chỉ có thể được sử dụng trong các phương thức không tĩnh.$this
được dùng để truy cập các thuộc tính và phương thức của đối tượng mà phương thức không tĩnh đang được gọi. Nó giúp bạn truy cập và làm việc với dữ liệu cụ thể của một đối tượng.Ví dụ:
class Example { public $name = "PHP"; public function getName() { return $this->name; // sử dụng $this để gọi thuộc tính của đối tượng } } $obj = new Example(); echo $obj->getName(); // Output: PHP
$this
chỉ có thể được sử dụng khi phương thức không tĩnh được gọi từ một đối tượng của lớp. Nó không thể được sử dụng trong các phương thức tĩnh vì không có đối tượng cụ thể nào tại thời điểm đó.Đặc điểm | self | $this |
---|---|---|
Phạm vi sử dụng | Chỉ trong phương thức tĩnh (static) | Chỉ trong phương thức không tĩnh (non-static) |
Tham chiếu đến | Lớp hiện tại | Đối tượng hiện tại |
Truy cập | Thuộc tính và phương thức tĩnh | Thuộc tính và phương thức của đối tượng |
Cách gọi | self::method() hoặc self::$property | $this->method() hoặc $this->property |
Thời điểm sử dụng | Khi không cần đối tượng | Khi cần thao tác trên một đối tượng cụ thể |
Như vậy, self
thường dùng khi bạn làm việc với các thành viên tĩnh của lớp, còn $this
thì dùng để tương tác với đối tượng hiện tại.
self
Trong Lớp Cha Khi Kế Thừa Trong PHPTrong PHP, khi một lớp con kế thừa từ một lớp cha, việc gọi self
trong lớp cha không kế thừa được toàn bộ theo cách bạn có thể mong đợi. Dưới đây là chi tiết cách hoạt động và hạn chế của việc sử dụng self
trong ngữ cảnh kế thừa:
self
trong lớp cha và kế thừaself
trong lớp cha, nó sẽ luôn tham chiếu đến lớp mà nó được định nghĩa (tức là lớp cha), không phải lớp con.self
, thì self
vẫn sẽ tham chiếu đến lớp cha, không phải lớp con.class ParentClass { public static function who() { echo "Lớp cha: " . __CLASS__; } public static function callWho() { self::who(); // self sẽ gọi phương thức của chính lớp ParentClass } } class ChildClass extends ParentClass { public static function who() { echo "Lớp con: " . __CLASS__; } } ChildClass::callWho(); // Kết quả là "Lớp cha: ParentClass"
ChildClass::callWho()
, phương thức callWho()
được kế thừa từ lớp cha ParentClass
, và bên trong phương thức đó, self::who()
được gọi.ChildClass
), nhưng self
trong lớp cha vẫn luôn tham chiếu đến ParentClass
, nên kết quả trả về là "Lớp cha: ParentClass"
.self
theo kiểu “động,” nghĩa là self
luôn tham chiếu đến lớp mà nó được định nghĩa.static
(Late Static Binding)Nếu bạn muốn trong trường hợp này, phương thức who()
trong lớp con được gọi thay vì lớp cha, bạn có thể sử dụng từ khóa static
thay cho self
. Đây là khái niệm “Late Static Binding” trong PHP, và nó cho phép phương thức gọi chính lớp thực tế (tức là lớp con) khi phương thức tĩnh được kế thừa.
Ví dụ sử dụng static
:
class ParentClass { public static function who() { echo "Lớp cha: " . __CLASS__; } public static function callWho() { static::who(); // static sẽ gọi phương thức của lớp thực tế, tức là ChildClass } } class ChildClass extends ParentClass { public static function who() { echo "Lớp con: " . __CLASS__; } } ChildClass::callWho(); // Kết quả là "Lớp con: ChildClass"
static::who()
thay vì self::who()
, PHP sử dụng cơ chế “Late Static Binding”, cho phép phương thức who()
trong lớp con (ChildClass
) được gọi. Kết quả lúc này sẽ là "Lớp con: ChildClass"
.Nếu muốn lớp con có thể ghi đè và gọi phương thức của chính nó, bạn nên sử dụng static
để tận dụng cơ chế Late Static Binding.
self
trong lớp cha sẽ luôn tham chiếu đến lớp mà nó được định nghĩa (lớp cha), kể cả khi được gọi từ lớp con.