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 self
là 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 self
là 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 static
từ khóa: bây giờ nó có thể được sử dụng chính xác nơi chúng ta đã sử dụng self
trong 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, static
thay vì self
, bây giờ bạn sẽ nhận được:
object(MyChildClass)#1 (0) { }
Có nghĩa là static
loạ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 self
khô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ế static
từ 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.