Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

PHP OO ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

Estas en el tema de ¿Usar get/set dentro de la clase o accceder directamente a la propiedad? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, Siguiendo con mi batería de preguntas absurdas... ¿Qué es mejor, usar siempre get y set para trabajar con las propiedades o sólo usar get ...
  #1 (permalink)  
Antiguo 08/07/2012, 05:45
Avatar de Ronin46  
Fecha de Ingreso: junio-2009
Mensajes: 398
Antigüedad: 14 años, 9 meses
Puntos: 8
¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

Hola,

Siguiendo con mi batería de preguntas absurdas...

¿Qué es mejor, usar siempre get y set para trabajar con las propiedades o sólo usar get y set desde fuera de la clase?

Ejemplo ilustrativo
Código PHP:
/* Caso 1 */
class cPersona
{
    private 
$Edad;
    
    public function 
PrintEdad ()
    {
        return (
'Tienes ' $this->Edad ' años');
    }
}

/* Caso 2 */
class cPersona
{
    private 
$Edad;
    
    public function 
GetEdad () { return $this->Edad; }
    
    public function 
PrintEdad ()
    {
        return (
'Tienes ' $this->GetEdad() . ' años');
    }

Gracias!
__________________
http://www.controldegastos.com, acepto sugerencias para el sitio.
Repetir conmingo: "tengo que dedicar más tiempo a gozar de placer"
  #2 (permalink)  
Antiguo 08/07/2012, 05:57
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

En estos casos, yo siempre utilizo $this->getLoquesea(). Simplemente porque así recibo el dato (tratado o no) como yo quiero.
  #3 (permalink)  
Antiguo 08/07/2012, 08:17
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

Puede parecer bueno tener un método en medio donde puedas meter algo más pero entonces ya no sería un getEdad(), seria un getCalculoEdad() por ej.

Prefiero el primer caso.
  #4 (permalink)  
Antiguo 08/07/2012, 13:13
Avatar de SetheR  
Fecha de Ingreso: enero-2009
Mensajes: 265
Antigüedad: 15 años, 3 meses
Puntos: 44
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

Y si el getter al que llamo tiene que devolverme un objeto que implemente la interfaz YYY pero voy a usarlo contadas veces?

Es muy común utilizar la carga de clases y/u objetos sólo cuando son necesarios, de otra manera, estarías desperdiciando recursos.

Ejemplo:

Código PHP:
Ver original
  1. class A{
  2.         private $miServicio;
  3.         private $id;
  4.     private $contador;
  5.    
  6.     public function __construct($id, $contador){
  7.         $this->id = $id;
  8.         $this->contador = $contador;
  9.     }
  10.    
  11.     public function getServicio(){
  12.         if(null === $this->miServicio){
  13.             //cargar clase, etc
  14.             $this->miServicio = new Servicio($this->id);
  15.         }
  16.         return $this->miServicio;
  17.     }
  18.    
  19.     public function usar(){
  20.         $this->miServicio->hacer(); //No funciona
  21.        
  22.         $this->getServicio()->hacer(); //Bien
  23.     }
  24. }
  #5 (permalink)  
Antiguo 08/07/2012, 16:13
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

Entiendo, pero si por eso lo usas "siempre" estarías haciendo una regla de una excepción y tendrías un montón de getters/setters que llevan tiempo codear (todo suma ) y crean "ruido". Es mas facil de leer el $this que tener q ir siempre al get a ver que hace.

Con respecto al ejemplo creo q hacerlo en el get es un poco tarde, poco semantico (estas haciendo un set) y hard.

Código PHP:
Ver original
  1. class A{
  2.     private $miServicio;
  3.     private $id;
  4.     private $contador;
  5.  
  6.     public function __construct($id, $contador){
  7.        $this->id = $id;
  8.        $this->contador = $contador;
  9.    }
  10.  
  11.    public function setServicio($otroServicio = null)
  12.    {
  13.         $this->miServicio = (null !== $otroServicio && $otroServicio instanceof ServicioInterface) ? $otroServicio($this->id) : new Servicio($this->id);
  14.    }
  15.  
  16.     public function usar($otroServicio = null)
  17.     {
  18.         $this->setServicio($otroServicio); //Lo necesito, lo seteo.
  19.         $this->miServicio->hacer();
  20.     }
  21. }
  #6 (permalink)  
Antiguo 08/07/2012, 16:47
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

Honestamente no te sigo lisando Arg, el ejemplo de SetheR es lazy loading..., a día de hoy no debe haber fw que no lo utilice, personalmente suelo utilizar el accessor si este tiene logica(lazy loading, validations, etc...), si simplemente retorna el valor accedo a la propiedad directamente.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 08/07/2012, 20:17
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

En efecto, concuerdo con @masterpuppet, es mejor usar el get() y usar lazy loading cuando aplique.
  #8 (permalink)  
Antiguo 09/07/2012, 16:50
Avatar de lisandro Arg  
Fecha de Ingreso: octubre-2003
Ubicación: Cordoba, Argentina
Mensajes: 945
Antigüedad: 20 años, 6 meses
Puntos: 24
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

masterpuppet y GatorV creo q respondieron el post mas leyendo el ejemplo de SetheR que la pregunta original de Ronin46

El ejemplo surgió para mostrar un caso en el que podría necesitar hacer algo antes de devolver un valor. Una propiedad que tiene q tener una instancia de un objeto y que no se setea en el constructor ni en un init la verdad es q creo es el menor de los casos y por eso decia que no es ejemplo para crear una regla.

Por lo que entiendo Ronin46 esta preguntando si, como en el caso q muestra, tiene una variable privada y no va a ser accedida desde fuera
es necesario de todas formas crear un metodo set y otro get. En ese caso, sinceramente no me parece que la resupuesta sea "siempre", sino mas bien, "solo cuando aplique", lo puedes ver en cualquier FW

Ronin, si te fijas en el segundo ejemplo no solo estás devolviendo el valor también estás cambiando la visibilidad, escribir un método más es un punto más en donde te puedes equivocar.
  #9 (permalink)  
Antiguo 10/07/2012, 11:23
Avatar de Ronin46  
Fecha de Ingreso: junio-2009
Mensajes: 398
Antigüedad: 14 años, 9 meses
Puntos: 8
Respuesta: ¿Usar get/set dentro de la clase o accceder directamente a la propiedad?

lisandro Arg, leyendo tu post creo que quien lo entendió mal fuiste tu

En el caso de que necesite hacer algo antes de devolver un valor si tengo claro que tengo que llamar a un getEdad(), getCalculoEdad() o lo que sea. Más luego los casos que comentan, pero bueno, esos casos no los voy a comentar porque en estos momentos se salen de mis conocimientos (poquito a poco...).

Si la propiedad no va a ser accedida desde fuera, y se puede recoger su valor tal cual, podrías aplicar dos estrategias, crear un método privado / protected llamado getEdad(), lo cual te permite anticiparte por si el día de mañana decides hacerlo público o bien si el día de mañana le vas a meter cálculo. La otra estrategia sería acceder directamente a la propiedad, cosa que veo más lógica.

Ahora bien, llegamos al caso por el que iba la pregunta, ya tengo un getEdad() definido porque quiero que dicha propiedad pueda ser accedida desde fuera, dentro de mi clase, aprovechando la situación, me dedico a recoger la propiedad con getEdad() o accedo directamente a la propiedad (no cambio la visibilidad a nada, simplemente utilizo lo que ya tengo).

La conclusión que he sacado hasta el momento es: si sólo recoge valor accede a la propiedad directamente y si hace cálculos llama al método (lógico), si el día de mañana necesitas un tratamiento de la propiedad (por ejemplo getCalculoEdad()) pues te recorres la clase y sustituyes la llamada a la propiedad por la llamada a getCalculoEdad().

EDITO: La verdad es que viendo el ejemplo que puse en el primer post si que da lugar a la confusión que has tenido.
__________________
http://www.controldegastos.com, acepto sugerencias para el sitio.
Repetir conmingo: "tengo que dedicar más tiempo a gozar de placer"

Etiquetas: clase, class, directamente
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:26.