2010-06-21 8 views
6

PHP ha funzioni _get e _set integrate. È meglio scrivere le mie funzioni get e set per ogni variabile o utilizzare le funzioni integrate con una tonnellata di if else se? Quali sono i pro e i contro di ciascun metodo?_get & _set di PHP o funzioni di get e set univoche per ogni variabile?

+0

Sarebbe probabilmente d'aiuto se spiegassi perché è necessario usare '__get' e' __set', a differenza dei soli campi pubblici. Puoi sempre passare a '__get' e' __set' più tardi. –

+0

Voglio essere in grado di verificare che i dati siano legali e che alcuni dati necessitino di riformattazione prima di essere salvati nel database, –

risposta

4

__get e __set sono metodi magici che in genere dovrebbero essere utilizzati per risolvere problemi complessi anziché essere utilizzati come base di progettazione.

Per esempio, mi sono trovato in un progetto in cui dovevo analizzare un sito che utilizzava l'OOP con ereditarietà profonda (> 2) e una delle importanti classi base aveva una proprietà pubblica chiamata name. Tuttavia, aveva anche getter e setter (getName, setName) che accedevano a quella proprietà per il solo scopo di ottenerla e impostarla. Molte classi chiamate getName e altrettanti hanno accesso direttamente alla proprietà name! Non un grande design.

I metodi magici mi hanno permesso di risolvere il problema rinominando la proprietà su _name e rendendola privata, forzando tutte le richieste alla proprietà attraverso i getter ei setter.

Detto questo, non c'è bisogno di getter e setter se si tratta semplicemente di una proprietà come una variabile. In tal caso, basta rendere pubblica la proprietà!

Nel tuo caso, poiché è in corso la convalida/disinfezione, è necessario impiegare getter e setter e codificarli direttamente come metodi (piuttosto che incorrere inutilmente nell'overhead dei metodi magici).

+0

Suppongo che ci sia un numero molto elevato di posti dove $ istanza -> nome è stato fatto, destra? Perché personalmente penso che sarebbe stato meglio cambiare le classi che lo facevano per usare getName()/setName() e rendere $ name protetto. Suppongo che potresti avere i tuoi metodi __get e __set emettere un E_NOTICE o E_DEPRECATED quando chiamato, in quel modo roba funzionerebbe ancora, ma verrai allertato dove non lo stavi facendo attraverso i setter/getter. Questo sono solo io però. – GordonM

2

Tendo ad affermare che se si dispone di una complessa logica get o set, aggiungere un metodo get o set separato. Se stai facendo qualcosa di semplice, puoi sfruttare __get o __set quando altrimenti ti ripeteresti in molti metodi get/set personalizzati.

3

Ecco come gestisco questo problema.

final public function __set($key, $value) { 
    $method = 'set' . ucfirst($key); 
    if (method_exists($this, $method)) { 
     $this->data[$key] = $this->$method($value); 
    } else { 
     $this->data[$key] = $value; 
    } 
    } 


    final public function __get($key) { 
    $method = 'get' . ucfirst($key); 
    if (method_exists($this, $method)) { 
     return $this->$method($this->data[$key]); 
    } else { 
     return $this->data[$key]; 
    } 
    } 

Se si dispone di un gestore personalizzato per una proprietà, esso viene chiamato (ammesso che il nome da getProperty). In caso contrario, viene utilizzato il metodo magico get/set predefinito.