jataincubus, cómo estás?
Te cuento un poco como utilizo yo el tema de los Singletons, en algunas clases. Generalmente, como dicen Singletons no están mucho mejor que utilizar variables globales.
No es que estén mal de por si, solamente son complicadas a la hora de testear, en incluso hacen que tu código sea un poco más cerrado a cambios, por lo cual siempre es recomendable que tus clases puedan recibir clases como parámetros, y si no se lo definiste de antamano, utilizar alguna clase por defecto.
Esto es lo que hago yo:
Código PHP:
<?php
class ClaseA
{
protected $_instance = null;
/** Tipico Singleton */
public function getInstance()
{
if(null === $this->_instance)
{
$this->_instance = new self();
}
return $this->_instance;
}
}
/** Esta es la clase que va a utilizar internamente a ClaseA */
class ClaseB
{
protected $_clasea = null;
public function __construct(ClaseA $clasea = null)
{
/** No pregunto si es null o no, seteo directamente */
$this->setClaseA($clasea);
}
public function setClaseA($clasea)
{
/** acá tampoco pregunto, simplemente seteo */
$this->_clasea = $clasea;
}
/**
* Acá viene "el truco". Cuando yo necesito utilizar una ClaseA,
* utilizo este método para pedirlo siempre. Si al momento de necesitarlo
* no lo tengo instanciado, entonces recién acá lo instancio. Es
* una especie también de LazyLoad.
*/
public function getClaseA()
{
/** Acá si pregunto si es null */
if(null === $this->_clasea) {
$this->_clasea = ClaseA::getInstance();
}
return $this->_clasea;
}
}
Así es como te quedan varias maneras de setear la clase interna, y si ninguna fue utilizada, entonces "defaulteas" a utilizar el Singleton:
Código PHP:
/** Setearlo al momento de instanciación */
$claseb = new ClaseB(new ClaseA);
/** Setearlo utilizando un método */
$claseb->setClaseA(new ClaseA);
/** Utilizando la versión por defecto si no se indicó antes */
$claseb = new ClaseB();
$clasea = $claseb->getClaseA(); // Devuelve ClaseA::getInstance()
Espero que te sirva esto !