Thẳng đến điểm: Tôi có hai lớp đơn, cả hai đều thừa hưởng bản chất đơn từ một lớp siêu hạng. Tôi khởi tạo một số thuộc tính trên singleton đầu tiên, và sau đó có singleton thứ hai lấy trường hợp đầu tiên. Ví dụ đó, tuy nhiên, dường như không phải là một trong những tôi khởi tạo ở nơi đầu tiên. Một số mã ví dụ có thể giúp giải thích này:Tạo một lớp cơ sở Singleton bằng PHP 5.3
Thứ nhất, siêu hạng, cung cấp chất singleton (yêu cầu PHP 5.3 hoặc cao hơn):
class Singleton {
protected static $instance;
protected function __construct() { }
final private function __clone() { }
public static function getInstance() {
if (!(static::$instance instanceof static)) {
static::$instance = new static();
}
return static::$instance;
}
}
Sau đó, chúng tôi đã có các singleton đầu tiên mang một giá trị :
require_once('Singleton.php');
class SingletonA extends Singleton {
protected $value;
public function SingletonA() {
$this->value = false;
}
public function getValue() {
return $this->value;
}
public function setValue($value) {
$this->value = $value;
}
}
Sau đó singleton thứ hai tham chiếu đến singleton đầu tiên:
require_once('Singleton.php');
require_once('SingletonA.php');
class SingletonB extends Singleton {
public function getValue() {
return SingletonA::getInstance()->getValue();
}
}
Bây giờ cho các bài kiểm tra đó cho thấy cách này không thành công:
require_once('SingletonA.php');
require_once('SingletonB.php');
SingletonA::getInstance()->setValue(true);
echo (SingletonA::getInstance()->getValue()) ? "true\n" : "false\n";
echo (SingletonB::getInstance()->getValue()) ? "true\n" : "false\n";
Xét nghiệm này mang lại kết quả như sau:
true
false
Rõ ràng, ví dụ SingletonA rằng mã kiểm tra tài liệu tham khảo không phải là trường hợp tương tự mà các SingletonB tham chiếu cá thể. Tóm lại, SingletonA không đơn độc như tôi cần. Sao có thể như thế được? Và tôi có thể sử dụng ma thuật nào để khắc phục hành vi này, cho tôi một singleton thực sự?
Đây là lần đầu tiên tôi gặp phải hành vi Singleton được kế thừa. Cho dù nó có đúng cú pháp hay không, nó khá là lạ. – spender
SingletonA sẽ không bao giờ là một ví dụ của SingletonB, mặc dù cả hai đều là Singletons; từ khóa 'static' sẽ đảm bảo điều đó. – thetaiko
Tại sao không chỉ sử dụng Singleton? – Stephen