Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316

    [PHP] Problema astrazione classe

    Classe astratta base:
    Codice PHP:
    <?php
    namespace cache;

    abstract class 
    CacheEngine {
        abstract public 
    isCached($key);
        abstract public 
    store($key$data$expiration 0);
        abstract public 
    erase($key);
        abstract public 
    load($key);
    }
    Classe figlia base:
    Codice PHP:
    <?php
    namespace cache;

    class 
    CacheFile extends CacheBuilder interface ICacheFile {
        
        public function 
    store($key$data$expiration 0) {
            
            
        }
        
        public function 
    buildFileName($cacheFile) {
            
            
        }
        
        
    // ...
    }
    Ora vorrei estendere la classe figlia CacheFile per vari argomenti, esempio: file linguistici che provengono dal filesystem, configurazioni e dati generali che provengono dal database e boh qualsiasi cosa che mi venga in mente.

    Quindi:
    Codice PHP:
    class CacheFileLang extends CacheFile {}
    class 
    CacheFileDB extends CacheFile {}
    class 
    CacheFileTPL extends CacheFile {} 
    Con il punto che: non voglio inizializzare le classi nipote (CacheFileLang, CacheFileDB, CacheFileTPL) ma voglio comunque utilizzare le loro configurazioni (tipo che ne so la path per le lingue sarà una e per il database sarà un'analtra e per i template un'altra ancora. Voglio essere costretto solo a definire la classe padre CacheFile .

    Soluzioni? Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    1,316
    Provo a spiegarmi meglio:

    Io voglio accedere alle classi figlie dalla classe padre utilizzando i metodi settati nella classe figlia.
    p.s. io teoricamente non so quali sono le classi figlie.

    esempio:
    $cache = new CacheFile();
    $cache->CacheFileLang->store($arrayLingua); // nella classe CacheFileLang è definita la $cache_path = '/cache/language/'
    $cache->CacheFileDB->store($arrayFetchSQL); // nella classe CacheFileLang è definita la $cache_path = '/cache/db/'

    però il metodo store è presente solo nella classe padre, che ovviamente la classe figlia erediterà.
    Questo mi permette di aggiungere infinite classi per dati di store differenti e volendo anche cambiare totalmente l'architettura un domani (tipo fare lo store nel database):
    $cache->CacheSQLDB->store($arrayFetchSQL);

    senza modificare una riga di codice se non quella che inizializza la classe la prima volta.

    Ipotizzo che posso utilizzare __call, ma non mi faceva impazzire come idea, volevo trovare una soluzione differente, altrimenti mi metto l'anima in pace e faccio:

    Codice PHP:
    <?php
    namespace cache;

    class 
    CacheFile extends CacheBuilder implements ICacheFile {
       
       static private 
    $classes = [];
       
       public function 
    store($key$data$expiration 0) {
          
          
       }
       
       public function 
    buildFileName($cacheFile) {
          
          
       }
       
       public function 
    __call($name$arguments '') {
          return 
    self::$classes[$name]?: (self::$classes[$name] = new $name($arguments));
       }
       
       
    // ...
    }

    Anche se call non mi fa impazzire, così se mai vorrò cambiare metodo di caching dovrò modificare solo una righa di codice in futuro con la nuova classe aggiunta.

    Quindi teoricamente ho risolto, se avete soluzioni migliori fatemi sapere, grazie
    Ultima modifica di zacca94; 24-05-2016 a 10:10

  3. #3
    Te stai confondendo le configurazioni con i sistemi di cache.... Dovevi fare una interfaccia CacheEngine che definiva i metodi "astratti" di un sistema di Cache e poi implementarla con le vari classi figlie (Ad esempio, per fare cache su File facevi FileCache implements CacheEngine, etc ). Il discorso "la cache solo per la lingua" o "la cache solo per altre configurazioni" non hanno bisogno di una classe di cache apposita, hanno bisogno di un sistema di utilizzo di questi dati che probabilmente fa caching usando le tue classi di cache, ma che non è una derivazione del sistema di cache in se. Ad esempio potresti avere una classe per le traduzioni a cui passi la path del file delle traduzioni e questa usa cacheengine per caricarsi in cache i dati e ha gli opportuni metodi per fare il retrieve delle traduzioni .
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.