Estoy trabajando en un marco de aplicación web, y parte de él consiste en una serie de servicios, todos implementados como singletons. Todas ellas dan una clase de servicio, donde se implementa el comportamiento único, buscando algo como esto:Extendiendo singletons en PHP
class Service {
protected static $instance;
public function Service() {
if (isset(self::$instance)) {
throw new Exception('Please use Service::getInstance.');
}
}
public static function &getInstance() {
if (empty(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
}
Ahora, si tengo una clase llamada FileService implementado como esto:
class FileService extends Service {
// Lots of neat stuff in here
}
... llama FileService :: getInstance() no generará una instancia de FileService, como yo quiero, sino una instancia de servicio. Supongo que el problema aquí es la palabra clave "self" utilizada en el constructor del Servicio.
¿Hay alguna otra manera de lograr lo que quiero aquí? El código singleton es solo unas pocas líneas, pero me gustaría evitar cualquier redundancia de código siempre que pueda.
FYI: Este código utiliza [ 'get_called_class'] (http://us2.php.net/manual/en/function.get-called-class.php), añadido en PHP 5.3. Hacer esto en versiones anteriores es un poco más complicado. – Charles
Gracias Charles, actualizó la respuesta para solucionarlo. –
Santos sagrados, eso da miedo. Imagine que llama a 'getInstance' una docena de veces, eso es una docena de aperturas y una docena de lecturas del archivo de clase. – Charles