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.
Không có nhận xét nào:
Đăng nhận xét