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:
selfself đượ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ặcself::$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.