Sự khác nhau giữa self và $this trong PHP

Posted: Tháng Tám 25, 2013 in PHP - Immediate
Thẻ:, , , , , , ,

Thông thường để truy nhập vào một thuộc tính của một đối tượng, ta thường dùng $this. Nhưng khi truy xuất vào những thuộc tính static, có thể đối tượng đó chưa được khởi tạo nên ta không thể truy xuất qua $this được, bởi vậy ta cần dùng self để truy xuất.

Cú pháp: self::property

Tóm lại, $this sẽ trỏ tới đối tượng hiện thời còn self sẽ trỏ tới class hiện thời. Tức là sử dụng this->member cho non-static member và dùng self::$member cho static member.

Ví dụ:


<?php
class X {
    private $non_static_member = 1;
    private static $static_member = 2;

    function __construct() {
        echo $this->non_static_member . ' '
           . self::$static_member;
    }
}

new X();
?>

Tuy nhiên, khi tạo lập tính đa hình (polymorphism) cho đối tượng, ta không thể dùng self để thay thế cho $this, ta có thể thấy rõ điều này trong ví dụ sau:


<?php
class X {
    function foo() {
        echo 'X::foo()';
    }

    function bar() {
        $this->foo();
    }
}

class Y extends X {
    function foo() {
        echo 'Y::foo()';
    }
}

$x = new Y();
$x->bar();
?>

Ở ví dụ này, khi ta dùng $this, class Y được kế thừa từ class X. Kết quả là nếu đối tượng được khởi tạo là X nó sẽ xuất ra kết quả là X::foo và nếu đối tượng được khởi tạo là Y nó sẽ xuất ra kết quả là Y::foo.


<?php
class X {
    function foo() {
        echo 'X::foo()';
    }

    function bar() {
        self::foo();
    }
}

class Y extends X {
    function foo() {
        echo 'Y::foo()';
    }
}

$x = new Y();
$x->bar();
?>

Còn khi dùng self để thay thế cho $this trong ví dụ trên, tính đa hình sẽ bị loại bỏ hoàn toàn bởi X::foo luôn luôn được gọi.

Bình luận về bài viết này