Ok ora mi è più chiaro.
Nel tuo primo post hai detto "una specie di factory"... ma perchè non utilizzare una "vera" implementazione di questo pattern?
O meglio ancora potresti iniettare l'oggetto stesso della classe che vuoi utilizzare... qualcosa del genere
Codice PHP:
class QWConfiguration
{
protected $object;
public function __construct(QWConfig $object)
{
$this->object = $object;
}
public function getConfig()
{
return $this->object->getConfig();
}
}
abstract class QWConfig
{
protected $config;
protected $options;
public function __construct($options)
{
$this->options = $options;
}
public function getConfig()
{
return $this->initConfig();
}
abstract protected function initConfig();
}
class QWConfigDb extends QWConfig
{
protected function initConfig()
{
if (!$this->config)
{
// mi collego al database usando $this->options['server'] e $this->options['password'] ed eventualmente uso le altri opzioni
$this->config = sprintf('Dati estrapolati dal db... server => %s e password => %s
', $this->options['server'], $this->options['password']);
}
return $this->config;
}
}
class QWConfigXml extends QWConfig
{
protected function initConfig()
{
if (!$this->config)
{
// faccio il parsing di un file xml usando $this->options['path'] ed eventualmente uso le altre opzioni
$this->config = sprintf('Dati ottenuti dal parsing del file xml... path => %s', $this->options['path']);
}
return $this->config;
}
}
$config = new QWConfiguration(new QWConfigDb(array(
'server' => 'localhost',
'password' => 'password',
'opt_1' => 'opzione_1',
'opt_2' => 'opzione_2',
'opt_N' => 'opzione_N'
)));
echo $config->getConfig();
$config = new QWConfiguration(new QWConfigXml(array(
'path' => 'percorso/al/file.xml',
'opt_1' => 'opzione_1',
'opt_2' => 'opzione_2',
'opt_N' => 'opzione_N'
)));
echo $config->getConfig();
Ovviamente il mio è solo uno spunto da perfezionare.