2009-02-13 3 views
8

Al momento ho le mie variabili di classe PHP impostato in questo modo:Qual è il modo migliore per memorizzare le variabili di classe in PHP?

class someThing { 

    private $cat; 
    private $dog; 
    private $mouse; 
    private $hamster; 
    private $zebra; 
    private $lion; 

    //getters, setters and other methods 
} 

ma ho anche visto persone che utilizzano un singolo array per memorizzare tutte le variabili:

class someThing { 

    private $data = array(); 

    //getters, setters and other methods 
} 

Quale si usa, e perché? Quali sono i vantaggi e gli svantaggi di ciascuno?

risposta

11

Generalmente, il primo è migliore per le ragioni che altri hanno già affermato.

Tuttavia, se è necessario memorizzare i dati in una classe in modo privato, ma l'impronta dei membri dei dati è sconosciuta, spesso vedrai il tuo secondo esempio combinato con i ganci __get() __set() per nascondere che sono in corso immagazzinato privatamente.

class someThing { 

    private $data = array(); 

    public function __get($property) 
    { 
     if (isset($this->data[$property])) 
     { 
      return $this->data[$property]; 
     } 
     return null; 
    } 

    public function __set($property, $value) 
    { 
     $this->data[$property] = $value; 
    } 
} 

Poi, oggetti di questa classe può essere utilizzato come l'istanza di stdClass, solo nessuno dei membri impostate sono in realtà pubblica

$o = new someThing() 
$o->cow = 'moo'; 
$o->dog = 'woof'; 
// etc 

Questa tecnica ha i suoi usi, ma essere consapevoli che __get() e __set() sono nell'ordine di 10-12 volte più lento rispetto all'impostazione diretta delle proprietà pubbliche.

6

Se stai utilizzando private $data; hai appena ricevuto una quantità impenetrabile di dati ... Esprimendoli esplicitamente renderà la tua vita molto più semplice se stai cercando di capire come funziona una classe.

Un'altra considerazione è se si utilizza un IDE con completamento automatico, che non funzionerà con il secondo metodo.

1

Se il codice è ripetitivo, gli array e (foreach) ripetono le operazioni. Devi decidere se il concetto di "animale" nel tuo codice è ripetitivo o no, o se il codice deve scavare nell'unicità di ogni membro.

Se devo ripetere me stesso più di una volta, ciclo.

0

io preferisco il primo metodo, per alcuni motivi:

In un buon IDE, le proprietà della classe appaiono, anche se privata/protetta E 'più facile vedere ciò che è già stato definito, riducendo la probabilità che memorizzare le stesse informazioni due volte. Se il bus proverbiale ti colpisce mentre torni a casa, è molto più semplice per un altro sviluppatore entrare e leggere il tuo codice. E anche se non si applica a private var, lo fa a vars protetti, nelle classi che estendono questa classe, dovresti davvero cercare di evitare il secondo metodo per pura leggibilità.

Inoltre, come nota a margine, quasi sempre scelgo protetto su privato a meno che non abbia un motivo molto specifico per renderlo privato.

L'unica volta che probabilmente avrei usato il secondo metodo era se stavo conservando una raccolta di molti tipi di cose.

1
  • Utilizzare il primo metodo quando si sa che è necessaria tale variabile.
  • Utilizzare il secondo metodo (una serie di array di variabili) quando si hanno esigenze di variabili dinamiche.

È possibile combinare questi due metodi, quindi alcune variabili sono codificate nella classe, mentre altre sono dinamiche. Le variabili hardcoded avranno preferenza rispetto ai metodi magici.