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, Foolớ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 selftrong Foolớ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 Foolớp của mình nhưng bạn có một Barlớp có giá trị khác cho thuộc tính, nó sẽ sử dụng Foo::$barthay 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 selfsẽ dẫn đến Foo::$bar(1234). Và việc sử dụng staticsẽ 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 Barlớ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; staticCó 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 staticvới các thuộc tính.