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

Mi objeto no guarda un valor cambiado.

Estas en el tema de Mi objeto no guarda un valor cambiado. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas; por esta parte de los foros estrenándome. Que me atasco ya en lo más básico y no sé por qué no me chuta el ...
  #1 (permalink)  
Antiguo 09/07/2007, 12:23
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Mi objeto no guarda un valor cambiado.

Buenas; por esta parte de los foros estrenándome.

Que me atasco ya en lo más básico y no sé por qué no me chuta el asunto, así que si me puede alguien explicar la razón de que un objeto no guarde un valor que le cambio después de creado le quedaré bien agradecida.

Es con PHP4.

Tengo una clase Uno y una clase Dos que extiende a la primera.

Desde la primera (Uno) creo uno o más objetos de la clase Dos y los guardo en un array dentro de Uno.

En Uno tengo también una función para cambiar un determinado valor .

finalmente en Uno hay una función para escribir los valores de los objetos guardados en el array.

Código PHP:
class Uno{
    var 
$elementos;
    function 
uno(){
        
$this -> elementos = array();
    }
    function 
cambiaAtributo(){
        
$this -> valor 'maria castaña';
    }
    function 
agregaDos($nombre 'campo[]'$valor 'valor'){
        
$this -> elementos[] = new Dos($nombre$valor);
    }
    
    function 
escribe(){
        foreach(
$this -> elementos as $v){
            echo 
$v -> valor '<br />********<br />';
        }
    }

Aluego tengo una clase Dos que crea un objeto con un atributo nombre y otro atributo valor.

Código PHP:
class Dos extends Uno{
    var 
$nombre;
    var 
$valor;
    function 
dos($nombre 'campo[]'$valor 'valor'){
        
$this -> nombre $nombre;
        
$this -> valor $valor;
    }

Bueno, si ahora creo el objeto y le agrego el otro objeto y le pido que me muestre el valor me imprime lo que ha de imprimir

Código PHP:
$pepe = new Uno();
$pepe -> agregaDos('nombre''perico');
foreach(
$pepe -> elementos as $v){
    echo 
$v -> valor '<br />********<br />';

Si después uso el método cambiaAtributo() y le pido que me lo imprima también lo hace bien.

Código PHP:
foreach($pepe -> elementos as $v){
    
$v -> cambiaAtributo();
    echo 
$v -> valor '<br />********<br />';

Pero si le vuelvo a pedir que me imprima el valor al mismo objeto me escribe el valor que le dí cuando lo creé en vez del que cambié.

Código PHP:
foreach($pepe -> elementos as $v){
    echo 
$v -> valor '<br />********<br />';

Osea, me devuelve
Cita:
perico
********
maria castaña
********
perico
********
¿Por qué? ¿Qué error de concepto tengo? (o cual de todos mis errores de conceptos es exactamente en este caso)

Si me leíste hasta aquí, gracias verimach.

Saludos
  #2 (permalink)  
Antiguo 09/07/2007, 14:40
 
Fecha de Ingreso: enero-2007
Mensajes: 405
Antigüedad: 17 años, 4 meses
Puntos: 3
Re: Mi objeto no guarda un valor cambiado.

Hola, a mi la salida de ese codigo me sale esto:

perico
********
maria castaña
********
maria castaña
********

...que es lo correcto...


Saludos
  #3 (permalink)  
Antiguo 10/07/2007, 06:17
Avatar de shinblood  
Fecha de Ingreso: diciembre-2003
Ubicación: lima
Mensajes: 214
Antigüedad: 20 años, 4 meses
Puntos: 1
Re: Mi objeto no guarda un valor cambiado.

Hola tunait
No entiendo esta linea
$this -> valor = 'maria castaña';
en la clase uno no existe ningun atributo y metodo llamado valor esto le pertenece a la clase dos, y como veo clase dos hereda de uno y no al reves.
en todo caso creo que deberia ser algo asi
$this -> elementos[0]->valor = 'maria castaña';

Saludos,
PD: No he probado el codigo
__________________
saludos :adios:
  #4 (permalink)  
Antiguo 10/07/2007, 09:11
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Mi objeto no guarda un valor cambiado.

Hola tunait, en primer lugar tienes un error de concepto a la hora de heredar Uno de Dos, como Uno contiene varios Dos no es necesario que se hereden, eso como una cuestion.

La segunda es que en PHP4, los objetos no son regresados por referencia, si no por valor, y menos en un foreach, ya que el foreach actua en una copia del objeto/array, asi que tendrias que cambiar tu foreach por un for clasico y usar &= en tus asignaciones para regresar una referencia al objeto y no una copia.

Saludos.
  #5 (permalink)  
Antiguo 11/07/2007, 01:32
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Re: Mi objeto no guarda un valor cambiado.

Cita:
Iniciado por wigglyUtrera Ver Mensaje
Hola, a mi la salida de ese codigo me sale esto:

perico
********
maria castaña
********
maria castaña
********

...que es lo correcto...


Saludos
Hola wigglyUtrera

hum ... eso me dió que pensar. Probé el código en un servidor con php4.* y no guarda el cambio (el resultado que obtengo). Luego lo he probado en un servidor con php5 y funciona como esperaba (el resultado que te ha dado a tí).

Seguiré rascando el asunto, muchas gracias
  #6 (permalink)  
Antiguo 11/07/2007, 01:40
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Re: Mi objeto no guarda un valor cambiado.

Cita:
Iniciado por shinblood Ver Mensaje
Hola tunait
No entiendo esta linea
$this -> valor = 'maria castaña';
en la clase uno no existe ningun atributo y metodo llamado valor esto le pertenece a la clase dos, y como veo clase dos hereda de uno y no al reves.
en todo caso creo que deberia ser algo asi
$this -> elementos[0]->valor = 'maria castaña';

Saludos,
PD: No he probado el codigo
Buenas shinblood

La idea es llamar al método desde el propio objeto Dos. Igual también probé a referenciar al objeto como me sugieres y obtuve el mismo resultado, es decir, al momento imprime el valor cambiado pero no lo guarda y al volver a pedirlo vuelve a imprimir el valor inicial

  #7 (permalink)  
Antiguo 11/07/2007, 01:59
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Re: Mi objeto no guarda un valor cambiado.

Cita:
Iniciado por GatorV Ver Mensaje
Hola tunait, en primer lugar tienes un error de concepto a la hora de heredar Uno de Dos, como Uno contiene varios Dos no es necesario que se hereden, eso como una cuestion.
Muy buenas GatorV

Los errores de concepto es lo que trato de erradicar de mis neuronas (de las dos que tengo) Sin embargo te cuento que la idea es poder crear objetos Dos sin necesidad de crearlos desde Uno en determinados casos. Si creo directamente un Dos quiero poder acceder igual a los métodos definidos en Uno. ¿Es un error de concepto o está bien?


Cita:
Iniciado por GatorV Ver Mensaje
La segunda es que en PHP4, los objetos no son regresados por referencia, si no por valor, y menos en un foreach, ya que el foreach actua en una copia del objeto/array, asi que tendrias que cambiar tu foreach por un for clasico y usar &= en tus asignaciones para regresar una referencia al objeto y no una copia.
Ah cohones, no se me ocurrió mirar por ahí. No sabía que el foreach trabaja con una copia y no se me ocurrió consultar esa documentación (consulté otras, pero no para foreach). Pues usando un for funciona como esperaba. Muchas gracias por el tip

Un saludo
  #8 (permalink)  
Antiguo 11/07/2007, 07:51
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Mi objeto no guarda un valor cambiado.

No entiendo porque quisieras crear un objeto Dos y accesar a las propiedades de Uno directamente, me podrias de dar un ejemplo mas real, porque a como lo veo directamente es un error de concepto lo que tu estas haciendo es que Uno contenga de propiedad un arreglo con varios Dos, asi que por esa cuestion no deberias de heredar, te recomiendo que hagas tu diagrama UML para que claramente veas porque deben de ir separados los objetos.

Saludos!
  #9 (permalink)  
Antiguo 11/07/2007, 08:10
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Re: Mi objeto no guarda un valor cambiado.

Por ejemplo para formularios y campos de formulario. Si quiero crear un objeto formulario que se compone de objetos que son elementos de formulario. Pero quiero además tener la posibilidad de crear objetos de elementos de formulario sin que pertenezcan a ningún formulario en un momento dado y poder accesar a algún método de la clase padre.

La idea es clase formulario, clase para campos de tipo input, clase para campos de tipo textarea y otra clase para los selectores. Si quiero que las tres últimas tengan un método para poder cambiarles un atributo en un momento dado pienso en definirlo en una clase padre común a las tres clases en vez de declararlo en cada una de las tres clases (si la función va a ser igual para todos los casos, claro).

¿Es incorrecto el planteamiento? realmente me interesan los comentarios que me puedas aportar. Como mencionaba antes, lo que quiero es asimilar bien los conceptos.
__________________
Javascript Códigos - Bambú difunde
  #10 (permalink)  
Antiguo 11/07/2007, 08:46
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Re: Mi objeto no guarda un valor cambiado.

Conceptualmente, es incorrecto que el padre, desde que "nace" ya conozca a sus hijos. La herencia debes entenderla como una relación de generalización/especialización y no como si fueran nodos de HTML en el que <table> es "hijo" de <body>.

La clase padre y la clase hija comparten la misma esencia, pero la hija es más específica. En tu caso, no ocurre eso. <input> no es un tipo particular de <form>. Más bien <form> es un contenedor de <inputs>.

La relación que hay entre los dos objetos es de composición y no de herencia. Si le quitas el "extends" no pasa nada.

Clase Uno:
Maneja varias instancias de Dos. Pero ¿Qué maneja exactamente?
- Crea instancias de Dos y las almacena.
- Puede cambiar el valor de cualquiera de ellas.

Desde ahí, ya vemos que necesitas dos métodos (que ya los tienes). Simplemente habría que ajustar cambiaAtributo(). Y le tienes que decir qué atributo cambiar y cuál será el nuevo valor.
Código PHP:
    function cambiaAtributo($nombre$nuevo_valor){
        
$this->elementos[$nombre] = $nuevo_valor;
    } 
Claro, que primero tienes que comprobar que exista un elemento con ese nombre.

Saludos,
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 06:17.