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

Herencia

Estas en el tema de Herencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenos dias, tengo una pregunta, por ejemplo, tengo este codigo de prueba ya que estoy interesandome en POO. Código PHP: class  pacientes {     var  $nombrep ...
  #1 (permalink)  
Antiguo 01/07/2010, 06:40
 
Fecha de Ingreso: julio-2009
Ubicación: Argentina!
Mensajes: 324
Antigüedad: 15 años, 3 meses
Puntos: 4
Herencia

Buenos dias, tengo una pregunta, por ejemplo, tengo este codigo de prueba ya que estoy interesandome en POO.

Código PHP:
class pacientes{
    var 
$nombrep;
    var 
$edadp;
    var 
$raza;
    var 
$color;
        function 
setPaciente($nom,$edad,$raza,$color){
            
$this->nombrep=$nom;
            
$this->edadp=$edad;
            
$this->raza=$raza;
            
$this->color=$color;
            }
    var 
$nombrec;
    var 
$edadc;
    var 
$direccion;
    var 
$telefono;
        function 
setCliente($nom,$edad,$direccion,$telefono){
            
$this->nombrec=$nom;
            
$this->edadc=$edad;
            
$this->direccion=$direccion;
            
$this->telefono=$telefono;
            }
    }
            
    
$cliente1=new pacientes;
$cliente1->setPaciente("loli",10,"PP","Negro");
$cliente1->setCliente("Silvia",59,"castellanos 1234","011-456456"); 
si bien lo que hago no es nada del otro mundo, ahora lo que me interesa es hacer que me muestre los datos, pero quiero hacerlo mediante herencia, es decir, por ejemplo, algo que probe y no me anda, porque seguro esta mal.

Código PHP:
class mostrar extends pacientes{
    function 
mostrar(){
    return 
$this->nombrec;
    }
    } 
y luego hacer

Código PHP:
echo $cliente1->mostrar
y no me muestra nada, de seguro estoy errando muchas cosas.

ademas, otra cosa, si bien esto se puede hacer con funciones (Que en ralidad la clase es un conjunto de funciones) Aun no le encuentro provecho a hacer clases, me complico la vida (porque no las se usar por ahora) y no veo algo que me diga que rinde mas usar clases que simples funciones, alguno me puede decir las ventajas? que se yo, tiempo de ejecucion y demas?

Muchas gracias
  #2 (permalink)  
Antiguo 01/07/2010, 07:20
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Herencia

Bueno lo primero, contestando tu pregunta directamente, es que si lo haces directamente sin haber otorgado algún valor anteriormente a la propiedad no va a mostrar nada en pantalla. Debe ser algo como
Código PHP:
Ver original
  1. <?php
  2. class foo{
  3.     protected $bar;
  4.     public function __construct(){
  5.         $this->bar = 'baz';
  6.     }
  7. }
  8. class candy extends foo{
  9.     public function twix(){
  10.         return $this->bar;
  11.     }
  12. }
  13. $obj = new candy;
  14. echo $obj->twix();
Ahora lo que debes aprender, no se debe heredar por heredar. Te recomiendo que leas varios temas en este foro que hablan cuando es que se debe heredar y así no te compliques. Lo otro estás usando algún material o aprendiendo de un material que la forma como usa los métodos y las propiedades es obsoleta. Te recomiendo que leas algún material actualizado. Busca materiales que digan algo como OOP PHP5.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 01/07/2010, 08:50
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Herencia

También entender que la herencia es a nivel funcional, no a nivel de datos, es decir si tu instancias una clase del tipo paciente, y luego la heredas, no puedes mostrar los datos de paciente en tu clase heredada ya que es una clase nueva con propiedades nuevas.

Saludos.
  #4 (permalink)  
Antiguo 01/07/2010, 08:54
 
Fecha de Ingreso: julio-2009
Ubicación: Argentina!
Mensajes: 324
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Herencia

ha, pero por ejemplo, hago la clase y luego la heredo, me mantiene los datos o valores de la 1era clase? es decir la heredada? porq es lo que estoy tratando de hacer! :S bueno me voy a leer un manual mas actualizado de POO :S
  #5 (permalink)  
Antiguo 01/07/2010, 09:03
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Herencia

No, como te comento eso es imposible, la clase heredada es una nueva clase con nuevos valores, la herencia sirve para brindar nueva funcionalidad a una clase o para alterar cierta funcionalidad, no es a nivel de datos.

Sí te recomiendo que leas un buen manual de POO ya que el que tienes parece no dejarte claro para que sirve la herencia y como se aplica.

Saludos.
  #6 (permalink)  
Antiguo 01/07/2010, 09:06
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Herencia

@GatorV, ¿te refieres a que no muestra nada si instancio la clase padre en vez de la clase hija y tratar de ver los datos de la clase hija con la instancia de la padre? ¿o mal interprete?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 01/07/2010, 09:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Herencia

No entiendo muy bien tu pregunta, pero no, la herencia es a nivel funcional, no de datos, a menos que los datos sean estaticos en ese caso se compartirian entre todas las clases del mismo tipo.

Recuerda que la idea de la herencia es crear nuevos tipos de objetos que contengan funcionalidad agregada o modificaciones a la funcionalidad de la clase padre, pero en escencia son nuevos objetos.

Las instancias de objetos son entidades completamente independientes una de otra, a menos repito a menos que contengan datos estaticos que son compartidos con todas las clases del mismo tipo (ya que siguen las mismas reglas de acceso).

Saludos.
  #8 (permalink)  
Antiguo 01/07/2010, 09:45
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 21 años, 6 meses
Puntos: 60
Respuesta: Herencia

Exactamente si lo ven a nivel "objetos-realidad" Cuando uno hereda "genes" de nuestros padres tenemos las mismas caracteristicas pero son propias de nuestra persona.. osea NO leemos ni modificamos las caracteristicas de nuestro padre :D


__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #9 (permalink)  
Antiguo 01/07/2010, 09:46
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años, 5 meses
Puntos: 1517
Respuesta: Herencia

Es que no había entendido lo que habías mencionado al principio, pero con esta explicación entendí mejor a lo que te refieres. La pregunta era más bien a que había entendido que te referías a que si yo instancio la clase padre y trato de imprimir en pantalla los datos de la clase hija (o sea la que extendió), pero con la instancia de la clase padre no podía ver los datos de la clase extendida (que sé que no se podrá porque es otra clase). Era más bien algo que me había confundido en lo que habías dicho al principio. Gracias
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #10 (permalink)  
Antiguo 06/07/2010, 17:14
 
Fecha de Ingreso: julio-2009
Ubicación: Argentina!
Mensajes: 324
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Herencia

Muchas gracias por contestar, y disculpen no haber podido responder yo tmb, estos ultimos dias fueron medio complicados!

cuando herede la clase era solo para un ejemplo, como estoy empezando con esto lo queria hacer bien facil, como para ver como trabaja.

si bien lei bastante mas sobre herencias me queda una duda existencial (Faaa no sera mucho? jaja )

Sobre los metodos: Private, Protected y Public.
Entiendo que Public es el metodo mas permisivo, el cual se puede modificar dentro de la clase donde se lo instancia y tambien dentro de las clases herederas, tanto asi como en el mismo programa. ¿Verdad?

El Protected tiene un nivel medio, ya que se puede modificar dentro de la clase principal y en las clases herederas, pero no puede ser modificado desde el programa. ¿Verdad?

y el Private, es el mas restrictivo de todos, siendo que solo puede ser utilizado en la clase donde fue hecho. ¿Verdad?


ademas de eso, veo que hacer una clase donde genero variables Privates termina siendo algo muy engorroso ya que luego, si quiero utilizarlas desde una clase "hija", debo crear una funcion, a lo que voy, que de importante tiene discriminar entre los metodos Private, Protected y Public, entiendo a lo que van con que se pierde el concepto de encapsulacion de la POO y que ese es uno de los conceptos fundamentales, pero creo que empeze con el pie izquierdo y me saltee sin querer esas distinciones!

Muchas gracias a todos por haber respondido y haberme dado una ayuda!
  #11 (permalink)  
Antiguo 06/07/2010, 18:28
Avatar de dots3r  
Fecha de Ingreso: julio-2008
Mensajes: 106
Antigüedad: 16 años, 3 meses
Puntos: 5
Respuesta: Herencia

Cita:
Iniciado por kadas99 Ver Mensaje
veo que hacer una clase donde genero variables Privates termina siendo algo muy engorroso ya que luego, si quiero utilizarlas desde una clase "hija", debo crear una funcion
Bueno, tu mismo te das la respuesta, si necesitas utilizar los atributos de la clase padre en una clase hija estos deben tener visibilidad "protected". La idea de definir los atributos privados es seguir el principio de ocultación.

Suerte =)
__________________
Ideorama. Su presencia en Internet

Última edición por dots3r; 06/07/2010 a las 18:50
  #12 (permalink)  
Antiguo 07/07/2010, 06:50
 
Fecha de Ingreso: julio-2009
Ubicación: Argentina!
Mensajes: 324
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Herencia

muchas gracias, les muestro un ejemplo y luego abajo las dudas que se me vienen a la cabeza.


Código PHP:
<?php

class video{
private 
$numero;
private 
$titulo;
private 
$tipo;
private 
$clase;
    public function 
__construct($num,$tit,$tipo,$clase){
        
$this->numero=$num;
        
$this->titulo=$tit;
        
$this->tipo=$tipo;
        
$this->clase=$clase;
        
$this->mostrar();
    }
    
    protected function 
mostrar(){
    echo 
"Numero: ".$this->numero;
    echo 
"<br />Titulo: ".$this->titulo;
    echo 
"<br />Tipo: ".$this->tipo;
    echo 
"<br />Clase: ".$this->clase."<br /><br />";
    }
}

class 
pelicula extends video{
private 
$duracion;
    function 
__construct($num,$tit,$tipo,$clase,$duracion){
    
parent::__construct($num,$tit,$tipo,$clase);
    
$this->duracion=$duracion;        
    
$this->mostrar();
    }
    
    function 
mostrar(){
    
parent::mostrar();
    echo 
"<br >Duracion: ".$this->duracion;
    }

}


$video1=new video(1,"The Others""Pelicula""DVD""160 minutos");
$video2=new video(2,"Apocalipsis","Pelicula","DVD""160 minutos");
$video3=new video(3,"Lineage2""Juego""DVD");

?>
como veran, es una clase padre VIDEO en donde el constructor inicaliza los datos de numero, titulo, tipo y clase....
1era pregunta: ¿esta bien haber definido esas variables como private? ¿porque?

luego, la funcion mostrar solo muestra los datos contenidos en ellos una vez inicializados ya que el constructor llama a la funcion mostrar();.

Extiendo la clase (Heredo) para hacer diferencia en el TIPO de video que sea, (PELICULA, JUEGO), en este caso solo cree la clase PELICULA en donde la variable es $duracion (Tiempo de duracion de la pelicula).

la funcion construct inicializa los valores pasados de la clase padre y a su vez tambien inicializa $duracion. Luego, en la primera linea llamo al constructor de la clase padre para que inicialize los valores antes mencionados y luego hago $this->duracion=$duracion para darle el valor de $duracion a duracion. ¿Hasta aca todo esta bien?

y por ultimo (Aca se me complica mas!) quiero mostrar por unica vez todo incluyendo la duracion, en donde hice esto

Código PHP:
function mostrar(){
    
parent::mostrar();
    echo 
"<br >Duracion: ".$this->duracion;
    } 
que ya probe y no funciona asi que de seguro hice todo o casi todo mal!
  #13 (permalink)  
Antiguo 07/07/2010, 09:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Herencia

El problema es que llamas a $this->mostrar() en el constructor, quitalo de ahí y solo llamalo cuando quieras mostrar los valores y con eso solo los vas a mostrar una vez.

Saludos.
  #14 (permalink)  
Antiguo 08/07/2010, 07:40
 
Fecha de Ingreso: julio-2009
Ubicación: Argentina!
Mensajes: 324
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Herencia

claro, pero cuando hago eso, de quitar del constructor el $this->mostrar(); y lo llamo como $video1->mostrar(); me queda asi...

Código PHP:
$video1=new video(1,"The Others""Pelicula""DVD""160 minutos");
$video1->mostrar(); 
y el error que me da es este

Código PHP:
Fatal errorCall to protected method video::mostrar() from context '' in C:AppServwwwpooindex3.php on line 42 
es porque la funcion mostrar esta protegida, por eso llamaba a esa funcion desde el constructor de la clase... mientras tanto voy a seguir viendo como es el tema pero asi veo que no va :S

muchas gracias.
  #15 (permalink)  
Antiguo 08/07/2010, 08:41
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 5 meses
Puntos: 2135
Respuesta: Herencia

Dejalo como public, los atributos public también se heredan.

Recuerda que la visibilidad de los atributos esta basada en lo que van a hacer, si tu función es mostrar los datos de la clase, debería ser public, para que la puedas llamar desde fuera.

Saludos.
  #16 (permalink)  
Antiguo 08/07/2010, 09:36
 
Fecha de Ingreso: julio-2009
Ubicación: Argentina!
Mensajes: 324
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Herencia

Sip, tenes razon! estaba pensando en eso mismo, el problema es que me falta aprender en que caso es mejor utilizar public, private o protected!

Te agradezco y a los demas usuarios tmb!

P.D.: Vengo leyendo guias, manuales, algunos acertados y otros no tanto, pero siempre que quiero cerrar un concepto o una idea pregunto en este foro y siempre me dan una buena respuesta, llena de informacion y muy bien explicado! Eso es lo que hace de este foro algo aparte, no es igual a los demas, este tiene ese gustito especial! Nuevamente muchas gracias a todos!

Etiquetas: herencia
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 10:38.