Rate this post

Chào mọi người! Trong quá trình học PHP mới, có lẽ nhiều bạn sẽ gặp khó khăn khi cố gắng hiểu rõ sự khác biệt giữa “$this” và “self” trong PHP. Tôi không phải là một trường hợp ngoại lệ, cũng từng mắc phải khá nhiều rối trong việc này. Trong bài viết này, tôi hy vọng có thể chia sẻ những kinh nghiệm và kiến thức mà tôi đã thu thập, giúp các bạn mới bắt đầu học ngôn ngữ PHP có cái nhìn rõ hơn về cách phân biệt “$this” và “self” 😄.

Các bài viết liên quan:

Giới thiệu về self và this

Trong PHP, cả từ khóa “self” và “$this” đều được sử dụng để tham chiếu đến thành viên của một lớp trong phạm vi của lớp đó. Các thành viên này có thể là biến hoặc phương thức. Tuy nhiên, “self” được sử dụng để tham chiếu đến thành phần tĩnh của lớp, trong khi “$this” được sử dụng để tham chiếu đến các thành phần không phải là tĩnh. Tuy vậy, có một số điểm quan trọng cần lưu ý: liệu “$this” có thể gọi các phương thức của thành viên tĩnh không, và “self” có thể gọi các phương thức của thành viên không phải là tĩnh không? Hãy cùng tìm hiểu điều này.

Sự Khác Biệt Giữa $thisself Trong Đối Tượng

Hãy theo dõi các ví dụ dưới đây để hiểu sự khác biệt giữa $thisself (hãy thử làm theo để hiểu rõ hơn).

Hãy cùng xem sự khác biệt giữa $thisself trong ngữ cảnh đối tượng bằng ví dụ về AnimalDog.

class Animal {
    public $classification = "Unknown";

    public function setClassification($classification) {
        $this->classification = $classification;
    }

    public function showClassification() {
        echo "This animal is classified as " . $this->classification . ".";
    }
}

class Dog extends Animal {
    public function setClassification($classification) {
        $this->classification = $classification;
    }
}

$animal = new Animal();
$animal->showClassification(); // Kết quả: This animal is classified as Unknown.

$dog = new Dog();
$dog->setClassification("Mammal");
$dog->showClassification(); // Kết quả: This animal is classified as Mammal.

Trong ví dụ này, chúng ta có hai lớp: AnimalDog. Lớp Animal chứa một thuộc tính $classification và hai phương thức setClassification()showClassification(). Lớp Dog kế thừa từ Animal và ghi đè phương thức setClassification(). Chúng ta tạo một đối tượng $animal từ lớp Animal và một đối tượng $dog từ lớp Dog.

  • Trong phương thức showClassification() của lớp Animal, chúng ta sử dụng $this->classification để truy cập thuộc tính của đối tượng hiện tại ($animal hoặc $dog).
  • Trong phương thức setClassification() của lớp Dog, chúng ta sử dụng $this->classification để thay đổi giá trị của thuộc tính $classification.

Khi chúng ta gọi showClassification() trên đối tượng $animal, nó hiển thị “This animal is classified as Unknown.” Tuy nhiên, khi chúng ta gọi setClassification("Mammal") trên đối tượng $dog và sau đó gọi showClassification() trên đối tượng $dog, kết quả là “This animal is classified as Mammal.”

Ví dụ này minh họa rằng $this tham chiếu đến các thành viên của đối tượng hiện tại, và chúng ta có thể thay đổi giá trị của thuộc tính của đối tượng.

Sự Khác Biệt Giữa $thisself Trong Phương Thức Tĩnh

Chúng ta sẽ xem xét ví dụ tiếp theo về cách sử dụng $thisself trong một phương thức tĩnh.

Hãy xem xét sự khác biệt giữa $thisself trong ngữ cảnh phương thức tĩnh bằng ví dụ AnimalDog.

class Animal {
    public static $classification = "Unknown";

    public static function setClassification($classification) {
        self::$classification = $classification;
    }

    public static function showClassification() {
        echo "This animal is classified as " . self::$classification . ".";
    }
}

class Dog extends Animal {
    public static function setClassification($classification) {
        self::$classification = $classification;
    }
}

Animal::showClassification(); // Kết quả: This animal is classified as Unknown.

Dog::setClassification("Mammal");
Animal::showClassification(); // Kết quả: This animal is classified as Mammal.

Trong ví dụ này, chúng ta có hai lớp: AnimalDog. Cả hai lớp đều chứa một biến tĩnh $classification và hai phương thức tĩnh setClassification()showClassification(). Lớp Dog kế thừa từ Animal và cũng có các phương thức tĩnh tương tự.

  • Trong phương thức tĩnh showClassification() của lớp Animal, chúng ta sử dụng self::$classification để truy cập biến tĩnh $classification của lớp hiện tại (Animal hoặc Dog).
  • Trong phương thức tĩnh setClassification() của lớp Dog, chúng ta sử dụng self::$classification để thay đổi giá trị của biến tĩnh $classification.

Khi chúng ta gọi showClassification() thông qua lớp Animal, nó hiển thị “This animal is classified as Unknown.” Tuy nhiên, sau khi chúng ta gọi setClassification("Mammal") thông qua lớp Dog và sau đó gọi showClassification() thông qua lớp Animal, kết quả là “This animal is classified as Mammal.”

Ví dụ này minh họa rằng self tham chiếu đến các thành viên của lớp hiện tại (có thể là Animal hoặc Dog), và chúng ta có thể thay đổi giá trị của biến tĩnh của lớp.

$this và self khi truy cập phương thức tĩnh và thuộc tính tĩnh

Hãy xem xét sự khác biệt giữa $thisself khi truy cập phương thức tĩnh và thuộc tính tĩnh bằng ví dụ AnimalDog.

class Animal {
    public $name;
    public static $classification = "Unknown";

    public function __construct($name) {
        $this->name = $name;
    }

    public function showDetails() {
        echo "This is {$this->name}, a " . self::$classification . ".";
    }
}

class Dog extends Animal {
    public static $classification = "Mammal";
}

$animal = new Animal("Fido");
$dog = new Dog("Buddy");

$animal->showDetails(); // Kết quả: This is Fido, a Unknown.
$dog->showDetails();    // Kết quả: This is Buddy, a Mammal.

Trong ví dụ này, chúng ta có hai lớp: AnimalDog. Lớp Animal chứa một thuộc tính $name (không phải tĩnh) và một biến tĩnh $classification. Lớp Dog kế thừa từ Animal và ghi đè giá trị của $classification.

  • Trong phương thức showDetails() của lớp Animal, chúng ta sử dụng $this->name để truy cập thuộc tính của đối tượng hiện tại và self::$classification để truy cập biến tĩnh $classification.
  • Lớp Dog không có phương thức showDetails() được định nghĩa mà sử dụng phương thức từ lớp cha.

Khi chúng ta tạo một đối tượng $animal từ lớp Animal và một đối tượng $dog từ lớp Dog, và sau đó gọi phương thức showDetails() trên cả hai đối tượng, kết quả thể hiện sự khác biệt:

  • Đối với $animal, thuộc tính $name được thể hiện với giá trị Fido, và biến tĩnh $classification từ lớp Animal là “Unknown.”
  • Đối với $dog, thuộc tính $name được thể hiện với giá trị Buddy, và biến tĩnh $classification từ lớp Dog là “Mammal.”

Ví dụ này minh họa rằng $this được sử dụng để truy cập thuộc tính của đối tượng hiện tại, trong khi self được sử dụng để truy cập biến tĩnh của lớp hiện tại.

Kết luận this và Self

THISSELF
Sự liên quanĐối tượng hiện tạiLớp hiện tại
Sử dụng trong phương thức tĩnhKhông thể sử dụngCó thể sử dụng
Truy cập thuộc tính tĩnhKhông thể truy cập hoặc thay đổiCó thể truy cập và thay đổi giá trị
Gọi phương thức tĩnhCó khả năng gọiCó khả năng gọi
Tính đa hìnhCó tính đa hìnhKhông gây ra tính đa hình

$this trong PHP là một từ khóa đặc biệt để trỏ đến đối tượng hiện tại của một class. Nó được sử dụng để truy cập các thuộc tính và phương thức của class. Sử dụng $this là một cách tiện lợi và chuẩn xác để truy cập các thuộc tính và phương thức trong class. Nếu sử dụng đúng cách, nó có thể giúp cho việc lập trình trở nên dễ dàng và sắp xếp.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now