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

¿Accesando a un miembro padre?

Estas en el tema de ¿Accesando a un miembro padre? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos! Se me acaba de presentar una GRAN pregunta, y estuve consultando en PHP.net, encontré que alguien más tenía la misma duda. Ayer ...
  #1 (permalink)  
Antiguo 18/01/2006, 12:31
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
¿Accesando a un miembro padre?

Hola a todos!

Se me acaba de presentar una GRAN pregunta, y estuve consultando en PHP.net, encontré que alguien más tenía la misma duda.

Ayer estaba tratando de accesar a un miembro padre sobreescrito en la clase hija, pero estuve como 2 horas intentando y no lo logré , hoy encontré un ejemplo en php.net que lo muestra con mayor claridad:

Código PHP:
class {
  var 
$x;

  function 
A() {
   
$this->32;
  }

  function 
joke() {
   print 
"A::joke " $this->"<br>\n"
  }
}

class 
extends {
  var 
$x;

  function 
B() {
   
parent::A();
   
$this->44;
  }

  function 
joke() {
   
parent::joke();
   print 
"B::joke " $this->"<br>\n";
  }
}

$obj = new B();
$obj->joke(); 
Esto da como resultado:

A::joke 44
B::joke 44


Pero lo que quiero que muestre es:

A::joke 32
B::joke 44


Hasta ahorita no he podido hacerlo por eso requiero de la ayuda de los expertos en el tema.

Un Saludo y Muchas Gracias!
  #2 (permalink)  
Antiguo 18/01/2006, 14:27
 
Fecha de Ingreso: mayo-2003
Mensajes: 148
Antigüedad: 21 años
Puntos: 0
La clase que hereda la he puesto así:

Código PHP:
class extends {

  function 
joke() {
   
parent::joke();    
   
$this->44;
   print 
"B::joke " $this->"<br>\n";
  }

Aunque mis conocimientos con clases no es muy profundo y que me corrijan si me equivoco no deberías de utilizar los mismo nombres para las clases como para los métodos, pues no se si ello puede dar lugar a confusión cuando uses parent:: ...
  #3 (permalink)  
Antiguo 18/01/2006, 14:41
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Cita:
Iniciado por NTrance
La clase que hereda la he puesto así:

Código PHP:
class extends {

  function 
joke() {
   
parent::joke();    
   
$this->44;
   print 
"B::joke " $this->"<br>\n";
  }

Hola Ntrance!

Entonces quedaría así:

Código PHP:
class {
  var 
$x;

  function 
A() {
   
$this->32;
  }

  function 
joke() {
   print 
"A::joke " $this->"<br>\n"
  }
}

class 
extends {
  var 
$x;

  function 
B() {
   
parent::A();
   
//$this->x = 44;
  
}

  function 
joke() {
   
parent::joke();    
   
$this->44;
   print 
"B::joke " $this->"<br>\n";
    }
  }
}

$obj = new B();
$obj->joke(); 
Pero eso no creo que resuelva el problema porque primero llamas el método padre mucho antes de definir la propiedad hija, dando como resultado el valor 32, pero por ejemplo si vuelvo a llamar al método padre justo después de definir la propiedad hija sale el mismo resultado, mira:

Código PHP:
class {
  var 
$x;

  function 
A() {
   
$this->32;
  }

  function 
joke() {
   print 
"A::joke " $this->"<br>\n"
  }
}

class 
extends {
  var 
$x;

  function 
B() {
   
parent::A();
   
//$this->x = 44;
  
}

  function 
joke() {
   
parent::joke();    
   
$this->44;
   
//Aquí esta la llamada al método padre de nuevo...
   
parent::joke();  
   print 
"B::joke " $this->"<br>\n";
    }
  }
}

$obj = new B();
$obj->joke(); 
Daría como resultado:

A::joke32
A::joke44
B::joke 44


Como puedes ver no puedo tener acceso al miembro padre sobreescrito en la clase hija.

Suerte!
  #4 (permalink)  
Antiguo 18/01/2006, 16:45
 
Fecha de Ingreso: mayo-2003
Mensajes: 148
Antigüedad: 21 años
Puntos: 0
Tas Sacao la familia entera, eh? Ten cuidao q como te salga la suegra... jajaja.

Código PHP:
<?php

  
class {
  var 
$x;

  function 
A() {
   
$this->32;
  }

  function 
joke() {
   print 
"A::joke " $this->"<br>\n";
  }
}

class 
extends {

  function 
joke() {
   
parent::joke();
   
$this->44;
   print 
"B::joke " $this->"<br>\n";
  }
}

$obj = new B();
$obj->joke();

?>
  #5 (permalink)  
Antiguo 18/01/2006, 23:04
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Hola NTrance!

Perdón que sea terco , hehe, pero creo que la última modificación que pusiste cambia pero en si es el mismo resultado como el que habías proponido anteriormente, si volviera a llamar al método joker sobreescrito ya no tendría acceso al miembro $x de la clase padre.

hehe, espero tu respuesta.

Suerte!
  #6 (permalink)  
Antiguo 23/01/2006, 11:44
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años
Puntos: 11
El problema que tienen es sencillo, es una confusión de HERENCIA en PHP (yo lo llamaría así).

En PHP herencia implica que se heredan propiedades y métodos. Ahora bien, si sobreescribimos un método de una clase base en una clase derivada, necesitamos el operando parent para acceder a dicho método de la clase base, pero esto no sucede con una propiedad.
Al sobreescribir la propiedad, no tenemos 2 propiedades que se llaman igual (una en cada clase), más bien ambas propiedades apuntan a la misma posición de memoria, entonces:

Si la clase B modifica a la variable x, se va a modificar el valor de la variable x en la clase A, por lo tanto el método joke() de la clase A utiliza el valor de su propiedad x que fue modificada por la clase derivada B.

Cita:
Pero eso no creo que resuelva el problema porque primero llamas el método padre mucho antes de definir la propiedad hija, dando como resultado el valor 32, pero por ejemplo si vuelvo a llamar al método padre justo después de definir la propiedad hija sale el mismo resultado
ERROR !!! Las dos clases están accediendo a la misma variable no a distintas variables, es por eso que después de modificar el valor de la propiedad en la clase B la clase A refleja el mismo resultado.
  #7 (permalink)  
Antiguo 23/01/2006, 11:48
 
Fecha de Ingreso: abril-2004
Ubicación: Rosario, Argentina
Mensajes: 124
Antigüedad: 20 años
Puntos: 11
jahepi:

Cita:
Esto da como resultado:

A::joke 44
B::joke 44


Pero lo que quiero que muestre es:

A::joke 32
B::joke 44
Te recomiendo que las propiedades no se llamen igual en ambas clases si querés lograr eso.

Saludos y espero que te sirva.
  #8 (permalink)  
Antiguo 23/01/2006, 16:03
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Mil gracias gnfrs y NTrance, por haberme resuelto esta gran duda que tenía.

Un saludo!
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 21:05.