Directo al punto: Tengo dos clases singleton, ambas heredan su naturaleza singleton de una superclase. Inicializo algunas propiedades en el primer singleton y luego tengo el segundo singleton que recupera la instancia del primero. Sin embargo, esa instancia no parece ser la que inicié en primer lugar. Un código de ejemplo podría ayudar a explicar esto:Creación de una clase base Singleton en PHP 5.3
En primer lugar, la super-clase, que proporciona la naturaleza Singleton (requiere PHP 5.3 o superior):
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;
}
}
entonces tenemos la primera Singleton llevar a un valor :
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;
}
}
A continuación, el segundo producto único que hace referencia a la primera Singleton:
require_once('Singleton.php');
require_once('SingletonA.php');
class SingletonB extends Singleton {
public function getValue() {
return SingletonA::getInstance()->getValue();
}
}
Ahora para la prueba que muestra cómo esta falla:
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";
La prueba se obtiene el siguiente resultado:
true
false
Claramente, la instancia SingletonA que las referencias de código de prueba no es la misma instancia que el SingletonB referencias de instancia En resumen, SingletonA no es tan simple como lo necesito. ¿Cómo es esto posible? ¿Y qué magia puedo utilizar para remediar este comportamiento, dándome un singleton verdadero?
Es la primera vez que me encuentro con el comportamiento heredado de Singleton. Si es o no sintácticamente correcto, es bastante extraño. – spender
Un SingletonA nunca será una instancia de SingletonB, a pesar de que ambos son Singletons; la palabra clave 'static' se asegurará de eso. – thetaiko
¿Por qué no usar simplemente un Singleton? – Stephen