Khi bạn sử dụng self
để chỉ một thành viên trong lớp, bạn đang đề cập đến lớp mà bạn sử dụng từ khóa trong đó. Trong trường hợp này, Foo
lớp của bạn định nghĩa một thuộc tính tĩnh được bảo vệ được gọi là $bar
. Khi bạn sử dụng self
trong Foo
lớp để tham chiếu đến thuộc tính, bạn đang tham chiếu đến cùng một lớp.
Do đó, nếu bạn đã cố gắng sử dụng self::$bar
ở nơi khác trong Foo
lớp của mình nhưng bạn có một Bar
lớp có giá trị khác cho thuộc tính, nó sẽ sử dụng Foo::$bar
thay vì Bar::$bar
, có thể không phải như những gì bạn dự định:
class Foo
{
protected static $bar = 1234;
}
class Bar extends Foo
{
protected static $bar = 4321;
}
Khi bạn gọi một phương thức qua static
, bạn đang gọi một tính năng được gọi là liên kết tĩnh muộn (được giới thiệu trong PHP 5.3).
Trong trường hợp trên, việc sử dụng self
sẽ dẫn đến Foo::$bar
(1234). Và việc sử dụng static
sẽ dẫn đến Bar::$bar
(4321) vì với static
, trình thông dịch sẽ tính đến việc khai báo lại trong Bar
lớp trong thời gian chạy.
Bạn thường sử dụng các liên kết tĩnh trễ cho các phương thức hoặc thậm chí chính lớp đó, thay vì các thuộc tính, vì bạn không thường khai báo lại các thuộc tính trong các lớp con; static
Có thể tìm thấy một ví dụ về việc sử dụng từ khóa để gọi một hàm tạo bị giới hạn cuối trong câu hỏi liên quan này: New self so với new static
Tuy nhiên, điều đó cũng không loại trừ việc sử dụng static
với các thuộc tính.