Foros del Web » Programando para Internet » PHP »

objeto creado con singleton que no se modifique por referencia

Estas en el tema de objeto creado con singleton que no se modifique por referencia en el foro de PHP en Foros del Web. Hola, mirad uso un singleton para crear un objeto desde una consulta, con el fin de que solo se ejecute una vez esa consulta y ...
  #1 (permalink)  
Antiguo 23/09/2015, 10:22
 
Fecha de Ingreso: junio-2009
Mensajes: 23
Antigüedad: 13 años, 7 meses
Puntos: 0
objeto creado con singleton que no se modifique por referencia

Hola, mirad uso un singleton para crear un objeto desde una consulta, con el fin de que solo se ejecute una vez esa consulta y se genere el objeto con unos datos concretos.

Una vez que se llama lo creará tan solo si antes no ha sido instanciado, hasta ahí todo bien, el problema es que luego al ser pasado por referencia este objeto desde fuera pueden cambiar su valor, no pasaría nada, pero a mi me interesa que aunque cambien su valor siempre que se instancie este objeto venga con los datos del registro, sin tener las modificaciones posteriores que otro programador hubiese realizado sobre él una vez creado.

Como lo soluciono? de momento el parche que he puesto es que cada vez que se instancie hago un clone, de ese modo siempre harán cambios sobre esa copia y no sobre el propio objeto creado al principio.

Como lo véis hacerlo así? tenéis alguna idea de como devolver el mismo objeto con sus datos cada vez que sel llame?
  #2 (permalink)  
Antiguo 23/09/2015, 13:21
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 14 años, 9 meses
Puntos: 2534
Respuesta: objeto creado con singleton que no se modifique por referencia

¿Y por qué razón expones públicamente dichos atributos si sabes perfectamente que no se deben modificar desde el exterior?

El diseño de tu clase, que por cierto no muestras, está muy mal fundamentalmente.

Para eso la OOP provee de visibilidad, en todo caso deberías usar private o protected para efectivamente impedir su manipulación por entidades externas.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 23/09/2015, 15:56
 
Fecha de Ingreso: junio-2009
Mensajes: 23
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: objeto creado con singleton que no se modifique por referencia

Bueno, lo explico de otra manera a ver si se entiende:

Quiero hacer lo siguiente, teniendo el identificador de un usuario, hago la consulta en la base de datos para traerme todos sus datos y obtener el objeto usuario.
Es el método obteneterUsuario($idUsuario).

Cualquiera que llama a este método obtendrá el objeto con los datos del usuario. Entonces, como se llama varias veces para obtener ese objeto, cada vez que se llama realiza una consulta a base de datos.

Yo quiero que sólo haga una vez esa consulta en la primera llamada, pues los datos del usuario serán siempre los mismos, y el resto de veces que llame al método obtenerUsuario($idUsuario) devuelva el objeto que ya previamente antes se había creado en su primera llamada.

Entonces, lo he hecho con singleton o con una variable global estática, pero esta hace referencia al objeto tanto cuando se llama como cuando se modifica (si tengo que dar la posibilidad) peeero el hecho de que en un punto del código se modifique no debería afectar al siguiente que lo llame y obtener el objeto que se obtuvo sin la última modificación.

Ejemplo:
//primera llamada, hace consulta y mete en una variable estática el objeto para ese usuario
$usuario = $user->obtenerUsuario($idUsuario);
echo $usuario->esActivo; //devuelve true
$usuario->esActivo = false;
...

//segunda llamada en otro lugar, no realiza consulta bbdd y lo obtiene de la variable estática
$usuario = $user->obtenerUsuario($idUsuario);
echo $usuario->esActivo; //devuelve false
...

Pues bien, esa segunda llamada es la que quiero que me devuelva el objeto de nuevas, sin modificaciones anteriores.

Mi pregunta es como hacer de otra forma para que no lance tanta consulta a base de datos sin necesidad?, pues en este caso la llamada $usuario = $user->obtenerUsuario($idUsuario); estaría por 1400 sitios o más.

un saludo, y gracias

Etiquetas: creado, objeto, referencia, registro, singleton
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 03:02.