2009-09-25 6 views
11

Je crée régulièrement une classe qui a quelques variables privées. Lorsqu'une instance de cette classe est définie, il devrait être possible de remplir toutes les variables de la classe avec des getters et setters.Quel est le meilleur moyen de générer automatiquement des getters et setters pour une classe en php?

Existe-t-il un moyen facile de faire cela sans avoir à taper tous ces setters et getters pour chaque variable lors de la création de la classe?

maintenant je dois saisir cette opération pour chaque var dans la classe

public function setVar($var){ 
$this->var = $var; 
} 

et

public function getVar(){ 
return $this->var; 
} 

Nous utilisons maintenant RegExp, mais je ne sais pas si cela est la meilleure façon .. Nous utilisons Eclipse comme environnement, donc il y a peut-être quelques plugins utiles?

+0

Bien qu'une douleur, il ne prend pas beaucoup de temps pour les mettre en œuvre. Je le fais habituellement pendant que je mange mon déjeuner. Mieux encore, passez le code à un étudiant pour l'ajouter. – Chris

+0

@Chris Le transmettre à quelqu'un d'autre ne peut être considéré comme une bonne solution. Un étudiant ou un complément pourrait vouloir avoir une bonne solution pour cela aussi ... – Kennethvr

Répondre

33

Avec Eclipse allez dans Préférences -> PHP -> Editeur -> Modèles -> Nouveau et utiliser quelque chose comme ceci:

private $$${PropertyName}; 
${cursor}  
public function get${PropertyName}() 
{ 
    return $$this->${PropertyName}; 
} 

public function set${PropertyName}($$value) 
{ 
    $$this->${PropertyName} = $$value; 
} 

Pour utiliser le modèle de type son nom et appuyez sur Ctrl + espace - un menu contextuel devrait apparaît également automatiquement lorsque vous tapez le nom.

+0

Des correctifs liés à l'utilisation du cas camel dans ces propriétés? – porfiriopartida

+0

@porfiriopartida Je me suis posé la même question et j'ai fini par utiliser une variable différente dans le get et le set. Lorsque vous utilisez le modèle, vous n'avez qu'à définir la propriété et la fonction getter. ;-) – andreas

2

Avez-vous regardé les méthodes __set et __get? Je ne sais pas si c'est ce que vous voulez dire, mais ils sont automatiquement appelés chaque fois qu'un membre de la classe est SET ou récupéré/récupéré/accédé.

0

Peut-être mieux sollution:

class base { 

    protected $_vars = array(); 


    public function setVar($name, $value = null) { 
     $this->_vars[$name] = $value; 
    } 

    public function getVar($name) { 
     return isset($this->_vars[$name]) ? $this->_vars[$name] : null; 
    } 
} 

Et simplement étendre cette classe. Ou vous pouvez également utiliser les méthodes __set et __get, mais elles sont plus lentes.

+0

cela pourrait être une bonne solution, mais est-ce une bonne idée de tout mettre dans un tableau, et pas tous comme différents vars? ou n'est-ce pas? – Kennethvr

+1

S'il fonctionne (comme les tableaux, les chaînes, etc.), c'est OK. Mais si vous voulez définir certains objets comme objet de base de données ou d'autres, vous ne devriez pas faire de cette façon. Ensuite, utilisez des constructeurs ou d'autres moyens. – Pawka

+0

Êtes-vous sûr que __set et __get mehods sont lents ?? – andho

1

Zend Studio dispose d'une fonction de génération automatique de getter/setter.

1

Je pense que la meilleure façon est d'utiliser les fonctions __set et __get avec certaines fonctions de chaîne, ici je vais vous montrer.

class UserProfile 
{ 
    public function __get($key) 
    { 
     if(isset($this->$key)) 
     { 
      return $this->$key; 
     } 
    } 

    public function __set($key,$val) 
    { 
     $this->cahnge($key,$val); 
    } 

    public function __call($key,$params) 
    { 
     if(substr("set",$key)) 
     { 
      //Update 
     }elseif(substr("get",$key)) 
     { 
      //return 
     } 

     //Else Blah 
    } 

    private function change($key,$val) 
    { 
     if(isset($this->$key)) 
     { 
      $this->$key = $val; 
     } 
    } 
} 

la méthode __call() vous permet de définir des fonctions telles que

$profile->setUsername('Robert Pitt'); aussi longtemps que vous substr le set/get et vérifier le reste de la chaîne comme une valeur de la classe:)

un autre exemple

public function __call($method,$params = array()) 
{ 

    if(isset($params[0]) && is_string($params[0])) 
    { 
     $this->$method = $params[0]; 
    } 
} 

//.... 

$profile->username('Robert Pitt'); 

Theres plus de travail à faire ici

+0

Êtes-vous sûr que cela fonctionne? Je ne pouvais pas le gérer. est-ce une sorte de magie PHP? Je peux appeler '$ profile-> __get (nom d'utilisateur)' mais je voulais appeler '$ profile-> getUsername()' – azerafati

Questions connexes