2010-06-21 14 views
6

PHP a des fonctions _get et _set intégrées. Est-il préférable d'écrire mes propres fonctions get et set pour chaque variable ou d'utiliser les fonctions intégrées avec une tonne d'if if if? Quels sont les avantages et les inconvénients de chaque méthode?_get & _set ou les fonctions get et set de PHP pour chaque variable?

+0

Il serait probablement utile si vous expliquez pourquoi vous devez utiliser '__get' et' __set', par opposition aux champs publics. Vous pouvez toujours changer en '__get' et' __set' plus tard. –

+0

Je veux être en mesure de vérifier que les données sont légales et que certaines données doivent être reformatées avant d'être sauvegardées dans la base de données, –

Répondre

4

__get et __set sont des méthodes magiques qui devraient normalement être utilisées pour résoudre des problèmes difficiles plutôt que pour être utilisées comme base de conception. Par exemple, je me suis retrouvé sur un projet où je devais analyser un site qui utilisait la POO avec un héritage profond (> 2) et une des classes de base importantes avait une propriété publique appelée name. Cependant, il a également eu des getters et setters (getName, setName) qui ont accédé à cette propriété dans le seul but de l'obtenir et de le définir. Beaucoup de classes ont appelé getName et autant ont accédé directement à la propriété name! Pas super design.

Les méthodes magiques m'ont permis de résoudre le problème en renommant la propriété _name et de la rendre privée, en forçant toutes les requêtes à la propriété via les getters et setters. Cela étant dit, il n'y a pas besoin de getters et setters si vous ne faites que traiter une propriété comme une variable. Dans ce cas, rendez la propriété publique! Dans votre cas, puisqu'il y a validation/désinfection en cours, vous devriez employer des getters et des setters et les coder directement comme des méthodes (plutôt que d'avoir à subir inutilement la surcharge des méthodes magiques).

+0

Je suppose qu'il y avait un très grand nombre d'endroits où $ instance -> name était en cours, droite? Parce que je pense personnellement qu'il aurait été préférable de changer les classes qui ont fait cela pour utiliser getName()/setName() à la place et faire protéger $ name. Je suppose que vous pourriez demander à vos méthodes __get et __set d'émettre un E_NOTICE ou E_DEPRECATED quand elles sont appelées, de cette façon les choses fonctionneraient encore mais vous seriez alertés là où vous ne le faisiez pas par les setters/getters. C'est juste moi. – GordonM

2

J'ai tendance à utiliser la règle suivante: si vous avez une logique get ou set complexe, ajoutez une méthode get ou set séparée. Si vous faites quelque chose de simple, vous pouvez tirer parti de __get ou __set lorsque vous vous répéteriez autrement dans beaucoup de méthodes get/set personnalisées.

3

Voici comment je gère ce problème.

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]; 
    } 
    } 

Si vous avez un gestionnaire personnalisé pour une propriété, il est appelé (en supposant qu'il s'appelle getProperty). Sinon, la méthode magique get/set par défaut est utilisée.