self trỏ đến lớp mà nó được viết.
Vì vậy, nếu phương thức getInstance của bạn nằm trong một tên lớp MyClass, thì dòng sau:
self::$_instance = new self();
Sẽ làm tương tự như:
self::$_instance = new MyClass();
Chỉnh sửa: một vài thông tin thêm, sau các ý kiến.
Nếu bạn có hai lớp mở rộng nhau, bạn có hai tình huống:
getInstance được định nghĩa trong lớp con
getInstance được định nghĩa trong lớp cha
Tình huống đầu tiên sẽ giống như thế này (Tôi đã xóa tất cả mã không cần thiết, ví dụ này - bạn sẽ phải thêm nó trở lại để có được hành vi singleton) *:
class MyParentClass {
}
class MyChildClass extends MyParentClass {
public static function getInstance() {
return new self();
}
}
$a = MyChildClass::getInstance();
var_dump($a);
Tại đây, bạn sẽ nhận được:
object(MyChildClass)#1 (0) { }
Mà có nghĩa selflà MyChildClass- tức là lớp mà nó được viết.
Đối với tình huống thứ hai, mã sẽ như thế này:
class MyParentClass {
public static function getInstance() {
return new self();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Và bạn sẽ nhận được loại đầu ra này:
object(MyParentClass)#1 (0) { }
Có nghĩa selflà MyParentClass- tức là ở đây, lớp mà nó được viết .
Với PHP <5.3, "lớp mà nó được viết" là quan trọng - và đôi khi có thể gây ra sự cố.
Đó là lý do tại sao PHP 5.3 giới thiệu một cách sử dụng mới cho statictừ khóa: bây giờ nó có thể được sử dụng chính xác nơi chúng ta đã sử dụng selftrong các ví dụ đó:
class MyParentClass {
public static function getInstance() {
return new static();
}
}
class MyChildClass extends MyParentClass {
}
$a = MyChildClass::getInstance();
var_dump($a);
Nhưng, staticthay vì self, bây giờ bạn sẽ nhận được:
object(MyChildClass)#1 (0) { }
Có nghĩa là staticloại đó trỏ đến lớp được sử dụng (chúng tôi đã sử dụng MyChildClass::getInstance()), chứ không phải lớp mà nó được viết.
Tất nhiên, hành vi của selfkhông được thay đổi, để không phá vỡ các ứng dụng hiện có - PHP 5.3 chỉ thêm một hành vi mới, tái chế statictừ khóa.
Và, nói về PHP 5.3, bạn có thể muốn xem trang Late Static Bindings của sổ tay PHP.