Thứ Năm, 30 tháng 6, 2016

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

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ụ:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?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.
Sưu tầm: https://bienuit.wordpress.com/2013/08/25/su-khac-nhau-giua-self-va-this-trong-php/