2011-11-16 6 views
8

Ho trovato il codice qui sotto in diversi punti del web e anche qui su Stack Overflow, ma non riesco a capirlo. So cosa fa, ma non so come faccia anche con gli esempi. Fondamentalmente sta memorizzando i valori, ma non so come aggiungo valori al registro. Qualcuno può tentare di spiegare come funziona questo codice, sia come imposto che come recuperare i valori da esso?Modello registro PHP

class Registry { 

    private $vars = array(); 

    public function __set($key, $val) { 
     $this->vars[$key] = $val; 
    } 

    public function __get($key) { 
     return $this->vars[$key]; 
    } 
} 
+0

È necessario impedire la sovrascrittura della funzione set con qualcosa di simile al seguente (utilizza anche array_key_exists, dovrebbe essere usato per entrambi i set e ottenere in questo caso) che è probabilmente importante quanto non usare le chiavi inesistenti perché l'intero scopo di il registro è per memorizzare informazioni, che è un po 'sconfitto dalla possibilità di sovrascrivere: 'set di funzioni pubbliche ($ key, $ val) {if (! array_key_exists ($ key, $ this -> _ nfo)) {$ this-> _nfo [$ key] = $ val; }} – user1205600

risposta

7

E 'usando PHP inciso sulla property overloading per aggiungere voci e recuperare le voci dalla $vars matrice privata.

Per aggiungere un alloggio, si può usare ...

$registry = new Registry; 
$registry->foo = "foo"; 

Internamente, questo sarebbe aggiungere una chiave foo al $vars array con valore stringa "pippo" tramite il metodo magico __set.

Per recuperare un valore ...

$foo = $registry->foo; 

Internamente, questo sarebbe recuperare l'entrata foo dalla matrice $vars tramite il metodo magico __get.

Il metodo __get dovrebbe davvero verificare le voci inesistenti e gestire tali elementi. Il codice così com'è attiverà un errore E_NOTICE per un indice indefinito.

Una versione migliore potrebbe essere

public function __get($key) 
{ 
    if (array_key_exists($key, $this->vars)) { 
     return $this->vars[$key]; 
    } 

    // key does not exist, either return a default 
    return null; 

    // or throw an exception 
    throw new OutOfBoundsException($key); 
} 
+0

Grazie, ho pensato che stavo impazzendo. Questo mi ha aiutato a tornare indietro e controllare cosa stava succedendo. Stavo cercando di impostare un'azione formale, ma era sempre in arrivo. Risulta che ero nella pagina indice, quindi non c'era alcun valore. DOH !. Ho provato il modulo su un'altra pagina e ha funzionato bene. Grazie per l'aiuto. Quando dici hackerato, vuol dire che non dovrebbe essere usato in questo modo? –

+0

@IanHoar Beh, sicuramente non dovrebbe essere chiamato * sovraccarico * – Phil

+0

@Phil Posso vedere come si aggiunge la chiave, ma come si aggiunge una coppia chiave-valore? –

8

Si potrebbe voler controllare PHP.NET - Overloading

In sostanza, si dovrebbe fare ...

$Registry = new Registry(); 

$Registry->a = 'a'; //Woo I'm using __set 
echo $Registry->a; //Wooo! I'm using __get 

Così qui, sto usando __set($a, 'This value is not visible to the scope or nonexistent') Inoltre, sto usando __get($a);

Spero che questo ha aiutato!

Problemi correlati