2009-09-25 19 views
11

Regularmente creo una clase que tiene algunas variables privadas. Cuando se establece una instancia de esta clase, debería ser posible completar todas las variables de la clase con getters y setters.¿Cuál es la mejor manera de auto generar getters y setters para una clase en php?

¿Hay una manera fácil de hacer esto sin tener que escribir todos estos setters y getters para cada variable en la creación de la clase?

ahora tengo que escribir esto para cada var en la clase

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

y

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

Ahora utilizamos RegExp, pero yo no sé si esta es la forma más fácil .. Usamos Eclipse como entorno, ¿entonces quizás hay algunos complementos útiles?

+0

Aunque es un dolor, no toma mucho tiempo implementar esto. Usualmente hago em mientras estoy comiendo mi almuerzo. Mejor aún, pase el código a un estudiante para agregarlo. – Chris

+0

@Chris Pasarlo a alguien más no se puede considerar una buena solución. Un estudiante o complemento podría querer tener una solución adecuada para esto también ... – Kennethvr

Respuesta

33

Con Eclipse vaya a Preferencias -> PHP -> Editor -> Plantillas -> Nuevo y, con algo como esto:

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

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

Para usar la plantilla de espacio de su nombre y pulse Ctrl + - un menú de contexto debe también aparece automáticamente cuando escribe el nombre.

+0

¿Alguna corrección relacionada con el uso de camel case en estas propiedades? – porfiriopartida

+0

@porfiriopartida Me pregunté sobre lo mismo y terminé usando una variable diferente en el get y el set. Al usar la plantilla, solo tiene que establecer la propiedad y la función getter. ;-) – andreas

2

¿Has mirado los métodos __set y __get? No sé si esto es lo que quiere decir, pero se llaman automáticamente cada vez que un miembro de la clase se establece o se recupera/se obtiene/se accede.

0

Tal vez mejor 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; 
    } 
} 

y simplemente extender esta clase. O también puedes usar los métodos __set y __get, pero son bastante más lentos.

+0

esto podría ser una buena solución, pero ¿es una buena idea poner todo en una matriz, y no todos como diferentes? o eso no importa? – Kennethvr

+1

Si están funcionando los datos (como matrices, cadenas, etc.) está bien. Pero si desea establecer algunos objetos como objeto de base de datos u otros, no debería hacerlo de esta manera. Luego usa constructores u otras formas. – Pawka

+0

¿Estás seguro de que __set y __get mehods son lentos? – andho

1

Zend Studio tiene una función de generación automática de getter/setter.

1

Creo que la mejor manera es usar __set y __get con algunas funciones de cadena, aquí déjame mostrarte.

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 __call() método le permitirá configurar con funciones tales como

$profile->setUsername('Robert Pitt'); todo el tiempo que substr el set/get y comprobar si el resto de la cadena como un valor de la clase:)

otro ejemplo

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

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

//.... 

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

Theres más trabajo que hacer aquí

+0

¿estás seguro de que esto funciona? No pude manejarlo. ¿Es esto algún tipo de magia PHP? Puedo llamar '$ profile-> __get (username)' pero quería llamar a '$ profile-> getUsername()' – azerafati

Cuestiones relacionadas