Uso statico in PHP

1

Ho alcune funzioni in PHP che leggono i dati dalle funzioni di una classe

readUsername(int userId){
$reader = getReader();
return $reader->getname(userId);
}

readUserAddress(){
$reader = getReader();
return $reader->getaddress(userId);
}

Tutti questi chiamano

getReader()
{
require_once("Reader.php");
static $reader = new Reader();
return $reader;
}

Una panoramica di Reader

class Reader{
getname(int id)
{
//if in-memory cache exists for this id return that
//else get from db and cache it
}

getaddress(int id)
{
 $this->getname(int id);
 //get address from name here
}

/*Other stuff*/

}

Perché è necessario il Lettore di classe La classe Reader esegue alcuni caching in memoria dei dettagli dell'utente. Quindi, ho bisogno di un solo oggetto di lettura di classe e memorizzerà i dettagli dell'utente invece di effettuare più chiamate db. Sto usando statico in modo che l'oggetto venga creato solo una volta. È questo l'approccio giusto o dovrei fare qualcos'altro?

    
posta nischayn22 30.05.2012 - 21:07
fonte

3 risposte

-1

% parole chiave% parole, ciò significa che è possibile accedere ai metodi o agli attributi di classe senza che sia stato istanziato alcun oggetto. Per questo motivo, esistono separatamente per mantenere il loro stato di accoppiamento limitato.

Il problema che stai affrontando può essere risolto, con una combinazione di pattern factory e singleton.

La tua classe Reader deve essere singleton, in modo che non vengano create istanze multiplex della stessa classe dello stesso scopo.

Ad esempio:

class Reader {
     private static $singletonObject = null;
     function __construct() { }

     public function static getInstance() {
        if(!SELF::$singletonObject) { SELF::$singletonObject = new Reader(); }
        return SELF::$singletonObject;
     }

     // Other
}

Ora, ogni volta che stai tentando di accedere alla classe Reader,

$reader = Reader::getInstance();

Ora, usa la classe $ reader come necessario. Ora è possibile creare un modello Factory e Singleton per fornire l'istanza della classe DB e della classe cache.

    
risposta data 31.05.2012 - 08:59
fonte
1

Considera il modello Registro , fornisce un modo di accedere a oggetti globali ed evita alcuni inconvenienti, che Singleton ha.

    
risposta data 30.05.2012 - 22:24
fonte
1

Dal tuo commento sulla domanda:

Once the reader object is created it uses some in-memory caching. So if I call reader twice for getName and getAddress I will be doing many things twice.

Sembra che Reader debba essere implementato in questo modo:

class Reader {
   private $name;
   public function getName() {
      if (isset($this->name)) { return $this->name; }

      $this->name = // Pull it from the database or wherever
      return $this->name;
   }
}

L'utilizzo è semplice e diretto e getReader() probabilmente non è nemmeno più necessario:

require_once("Reader.php");
getReader()
{
   return new Reader();
}
    
risposta data 31.05.2012 - 04:01
fonte

Leggi altre domande sui tag