$this và self trong PHP

Cập nhật: Lượt xem: 363 [ PHP ]

Hôm nay mổ sẻ chút về PHP nhé các bạn. Như chúng ta đã biết trong PHP self đề gọi static function còn this để gọi non-static function.

$this và self trong PHP

Một ngày đẹp trời bạn tự đặt câu hỏi thế giờ dùng this có gọi được static function không hay là dùng self có gọi được non-static function không. Để giải quyết vấn đề không có cách gì khác ngoài lao vào code đề làm rõ đúng không.

1. $THIS

$This dùng để tham chiếu đến đối tượng (object).

Ví dụ chúng ta có class Car và một class khác Lamborghini kế thừa từ Car. Class Lamborghini sẽ override phương thức whichClass() của class cha. Hãy cùng xem qua cài đặt của 2 class này, đầu tiên ta sẽ dùng $this:

class Car {

    public function whichClass() {
        echo "I am an Car!";
    }

    public function sayClassName() {
        $this->whichClass();
    }
}

class Lamborghini extends Car {

    public function whichClass() {
        echo "I am Lamborghini!";
    }

}

$lamborghiniObj = new Lamborghini();
$lamborghiniObj->sayClassName();//I am Lamborghini

Như đã nói ban đầu this để tham chiếu đến đối tượng mình nhắc lại là đối tượng nhé.Nên trong ví dụ trên khi ta khởi tạo đối tượng Lamborghini sau đó gọi đến method sayClassName được kế thừa từ class Car, ở đây hàm whichClass() được gọi bởi đối tượng Lamborghini nên kết quả trả về là I am Lamborghini.Nói một cách khác đây chính là ví dụ rất dễ hiểu về tính Đa hình (Polymorphism) trong PHP.

2. Self

Self dùng để truy cập đến chính class đó.

Vẫn là ví dụ trên ta thay đổi một chút nhé.

class Car {

    public function whichClass() {
        echo "I am Car!";
    }

    public function sayClassName() {
        self::whichClass();
    }
}

class Lamborghini extends Car {

    public function whichClass() {
        echo "I am Lamborghini!";
    }

}

$lamborghiniObj = new Lamborghini();
$lamborghiniObj->sayClassName();//I am Car

Điều gì đã khiến output thay đổi vậy. Vâng câu trả lời chính là do self::whichClass(). Như đã nói ở trên bản thân self sẽ biết mình phải gọi phương thức của chính Class chứa nó (tức là gọi hàm whichClass() của class Car.

3. Sử dụng $This với static function

Bây giờ chúng ta sẽ đi tìm câu trả lời ở đầu bài nhé. Tiếp tục theo dõi ví dụ sau:

class Car {

    public static function whichClass() {
        echo "I am an Car!";
    }

    public function sayClassName() {
        $this->whichClass();
    }
}

$carObj = new Car();
$carObj->sayClassName();

Thử dự đoán xem điều gì sẽ xảy ra, có thể bạn sẽ nghĩ luôn đến việc báo lỗi trong trường hợp này. Tuy nhiên kết quả không phải như vậy, chúng ta vẫn nhận được kết quả: “I am an Car!”. Bởi vậy, chúng ta có thể gọi static function với từ khóa $this không có vấn đề gì cả.

4. Sử dụng $this cho thuộc tính static

Tiếp tục xem ví dụ sau.

<?php
class ConGai {

    public static $trangthai = "chua di nha nghi";
	
    public function uongRuou() {
		$this->trangthai = "Di nha nghi";
    }
}
$conGai = new ConGai();
$conGai->uongRuou();
echo $conGai->trangthai;

Kết quả là “Di nha nghi”. Vậy là chúng ta kết luận có thể dùng $this để gọi ra thuộc tính static. Khoan kết luận nếu thực sự là như vậy thì class Con gái kia sau khi uống rượu trạng thái cũng phải là Di nha nghi ??? Kiểm tra thử coi.

<?php
class ConGai {

    public static $trangthai = "chua di nha nghi";
	
    public function uongRuou() {
		$this->trangthai = "Di nha nghi";
    }
}
$conGai = new ConGai();
$conGai->uongRuou();
echo $conGai->trangthai;//Di nha nghi
echo "<br>";
echo ConGai::$trangthai; //Chua di nha nghi

Giả dối, tất cả chỉ là giả dối. Tại sao thằng kia đã tác động đến trạng thái của nó là sau đó bạn gái kia không chấp nhận trạng thái ” Di nha nghi”.

Câu trả lời có là trong thực chất $this không hề làm việc với biến static kia mà PHP sẽ tự tạo ra một biến mới là trangthai với kiểu none-static(nếu chưa có) trong class ConGai. Vậy là chỉ là chúng ta cảm giác đang làm việc với biến static trangthai thôi. Mà cái gì mập mờ quá thì không nên làm đúng không. Người yêu mà cứ mập mờ thì next đi :D.

5. Tổng kết

Thông qua các ví dụ cụ thể hết sức thú vị, chúng ta đã hiểu hơn chút về self và $this cũng như cách sử dụng chúng. Ta sẽ tổng hợp lại thông qua bảng so sánh sau:

self $this
Tham chiếu đến Class hiện tại Tham chiếu đến đối tượng (Object) hiện tại
Dùng để gọi các hàm static và tham chiếu đến các thuộc tính static Có thể dùng để gọi các hàm static
Có thể dùng trong các hàm static (để truy cập đến các hàm hay thuộc tính static khác của Class) Không nên dùng để gọi các thuộc tính static (vì sẽ không truy cập được mà lại tự tạo ra các thuộc tính non-static của đối tượng), nên dùng self trong trường hợp này.
Khi được sử dụng sẽ ngăn chặn thể hiện của tính đa hình bằng việc bỏ qua vtable Không thể sử dụng được trong các hàm static

 

Nguồn: storyofsu.com