Il problema che sto affrontando è: dovrei usare le classi statiche per i componenti di un'applicazione solo per ottenere API più belle?
Esempio: il modo "normale":
// example component
class Cache{
abstract function get($k);
abstract function set($k, $v);
}
class APCCache extends Cache{
...
}
class application{
function __construct()
$this->cache = new APCCache();
}
function whatever(){
$this->cache->add('blabla');
print $this->cache->get('blablabla');
}
}
Nota quanto è brutto this->cache->...
. Ma diventa più brutto quando cerchi di rendere l'applicazione estensibile tramite plugin, perché devi passare l'istanza dell'applicazione ai suoi plugin e ottieni $this->application->cache->...
Con funzioni statiche:
interface CacheAdapter{
abstract function get($k);
abstract function set($k, $v);
}
class Cache{
public static
$ad;
public function setAdapter(CacheAdapter $a){
static::$ad = $ad;
}
public static function get($k){
return static::$ad->get($k);
}
...
}
class APCCache implements CacheAdapter{
...
}
class application{
function __construct(){
cache::setAdapter(new APCCache);
}
function whatever()
cache::add('blabla', 5);
print cache::get('blabla');
}
}
Qui sembra più bello perché basta chiamare cache::get()
ovunque. Lo svantaggio è che perdo la possibilità di estendere questa classe facilmente. Ma ho aggiunto un metodo setAdapter per rendere la classe estendibile ad un certo punto. Sto facendo affidamento sul fatto che non avrò bisogno di riscrivere per sostituire il wrapper della cache, mai, e che non avrò bisogno di eseguire più istanze di applicazioni simultaneamente (è fondamentalmente un sito - e nessuno lavora con due siti al stessa ora)
Quindi, sto sbagliando?