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

Obtener variables de una clase

Estas en el tema de Obtener variables de una clase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos!! Tengo una clase llamada A class A{ private $a } class B extends A{ private $b } Os planteo la siguiente pregunta, como ...
  #1 (permalink)  
Antiguo 24/01/2012, 12:02
 
Fecha de Ingreso: diciembre-2010
Mensajes: 79
Antigüedad: 9 años
Puntos: 3
Obtener variables de una clase

Hola amigos!!

Tengo una clase llamada A

class A{
private $a
}

class B extends A{
private $b
}


Os planteo la siguiente pregunta, como puedo obtener las variables de la clase B?

es decir quiero saber las propiedades de la clase B (serian $a y $b), pero al ser privada $a puedo obtener usando get_class_vars. Saben otra forma de hacerlo
  #2 (permalink)  
Antiguo 24/01/2012, 12:03
 
Fecha de Ingreso: noviembre-2007
Ubicación: Etzatlan, Jalisco
Mensajes: 50
Antigüedad: 12 años
Puntos: 18
Respuesta: Obtener variables de una clase

Puedes hacerla publica, o crear un método que regrese su valor
  #3 (permalink)  
Antiguo 24/01/2012, 12:06
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 11 años, 8 meses
Puntos: 2534
Respuesta: Obtener variables de una clase

Las propiedaddes y métodos privados no se heredan, por lo tanto desde B no puedes conocer la existencia de las variables privadas de A.
Código PHP:
<?php

class A{
private 
$a 'x';
}

class 
extends A{
private 
$b 'y';
}

$x = new B;

var_dump($x);
var_dump($x->a);
var_dump(get_object_vars($x));
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #4 (permalink)  
Antiguo 24/01/2012, 12:08
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 11 años, 4 meses
Puntos: 1532
Respuesta: Obtener variables de una clase

si declaras variables con ámbito privado sólo pueden ser accedidas desde la misma clase (encapsulación), para poder acceder a su contenido o las declaras como publicas (public) o le creas un getter.

por otro lado las variables protegidas (protected) son en esencia privadas, cuya única diferencia radica en que pueden ser accedidas desde clases extendidas, es decir, que hereden a la misma.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 24/01/2012, 12:13
 
Fecha de Ingreso: diciembre-2010
Mensajes: 79
Antigüedad: 9 años
Puntos: 3
Respuesta: Obtener variables de una clase

Anarkes: Las propiedades de A las quiero privadas, y tengo metodo publicos... Pero estoy creando una funcion de manera que sea dinamica, pero para ello necesito acceder a las propiedades de B. Imaginate que quiero hacer un toString de tal forma que miro las propiedes y genero el nombre del metodo tal que asi getPropiedad. No quiero acceder a las propiedes privadas, quiero saber el nombre de la propiedad. Por ello uso get_class_vars.

Pateketrueke: Si B hereda de A, es que B es de tipo A y contiene las misma propiedades de A. Una cosa es el acceso, evidentemente no puedo hacer lo que tu estas diciendo. Pero puedo usar metodos publicos en A para acceder. Es decir que las propiedades si se heredan en cierta forma. Lo unico es el acceso.
  #6 (permalink)  
Antiguo 24/01/2012, 12:15
 
Fecha de Ingreso: diciembre-2010
Mensajes: 79
Antigüedad: 9 años
Puntos: 3
Respuesta: Obtener variables de una clase

okis gracias, maycolalvarez. De todas formas yo no estoy accediendo en ningun momento a las variables. Yo lo que quiero es el nombre de las propiedades de B. Una cosa distinta es que php para saber el nombre de las propiedades tenga que ponerlo en protected como tu estas diciendo
  #7 (permalink)  
Antiguo 24/01/2012, 14:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Obtener variables de una clase

Usa Reflection => getProperties.

Saludos.
  #8 (permalink)  
Antiguo 25/01/2012, 06:05
 
Fecha de Ingreso: diciembre-2010
Mensajes: 79
Antigüedad: 9 años
Puntos: 3
Respuesta: Obtener variables de una clase

Hola GatorV,

Te explico con Reflection puedo entrar a las propiedades de cualquier clase es decir que si pongo...

$reflect = new \ReflectionClass("A");
$props = $reflect->getProperties();
var_dump($props);

Esto me devuelve las propiedades privadas, publicas y protected de A, pero si yo hago
$reflect = new \ReflectionClass("B");
$props = $reflect->getProperties();
var_dump($props);

No me saca las propiedades de A, pero mi pregunta es si la clase B es una herencia de A, php no deberia devolver tambien las propiedades de A?

Quizas me digas que usando get_parent_class, podria saber las clase padres y asi saber las propiedades, pero que pasa si hay una herencia de profundidad 3, es decir C hereda de B y B hereda de A. Por la propiedad de transitividad C es tambien de tipo A.

La funcion get_parent_class me da los padres directos es decir profundidad 2 o tambien los de profundidad 3. ??
  #9 (permalink)  
Antiguo 25/01/2012, 08:19
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 11 años, 4 meses
Puntos: 1532
Respuesta: Obtener variables de una clase

tampoco soy un experto en POO, pero si B hereda de A no quiere decir que las propiedades privadas de A sean vistas por B, porque el principio de encapsulación no se lo permite, para ello es protected.

si esto es así, me imagino que en otros lenguajes debe de ser similar, y si lo llevamos a la vida cotidiana un hijo hereda características físicas de su padre (public), y también otras no tan tangibles como su carácter y personalidad (protected), pero NO hereda su memoria y experiencias (private); es una analogía muy somera, pero creo que se adapta perfectamente al principio de POO

corrijanme si me equivoco
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #10 (permalink)  
Antiguo 25/01/2012, 08:58
 
Fecha de Ingreso: diciembre-2010
Mensajes: 79
Antigüedad: 9 años
Puntos: 3
Respuesta: Obtener variables de una clase

B hereda de A y no puede acceder al valor de las propiedades privadas de A. Hasta ahi estoy de acuerdo. Pero no tiene nada que ver eso, con acceder al nombre las propiedades de A, es decir si A tiene una propiedad llamada $nombre, y llamada $apellido. Desde B no quiero acceder al valor de $nombre y $apellido.

Lo que quiero hacer es que desde B sepas como se llaman las propiedades es decir se llamarian nombre y apellido.

Porque de esta manera haciendo un 'get'.nombre() puedo acceder al valor privado de la propiedad, es por eso que lo quiero automatizar. Porque quiero una funcion en B que me devuelva todas sus propiedades por ejemplo un toSTring() y no tener que poner un getNombre() y un getApellido()...

Estamos confundiendo conceptos. Esta claro que si una es privada no puedes acceder a su valor, pero quien dice que no puedas acceder al nombre de como se llama la propiedad.
  #11 (permalink)  
Antiguo 25/01/2012, 10:32
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 13 años, 6 meses
Puntos: 2135
Respuesta: Obtener variables de una clase

El problema es que la propiedad privada no se hereda, por lo mismo de que es privada, como el ejemplo que expuso @maycolalvarez, ve este ejemplo:

Código PHP:
Ver original
  1. <?php
  2. class A
  3. {
  4.     private $_nombre = 'Soy A';
  5.     public function getNombre()
  6.     {
  7.         return $this->_nombre;
  8.     }
  9. }
  10.  
  11. class B extends A
  12. {
  13.     private $_nombre = 'Soy B';
  14.    
  15.     /**
  16.      * @override
  17.      **/
  18.     public function getNombre()
  19.     {
  20.         return $this->_nombre;
  21.     }
  22.    
  23.     public function getAllNombres()
  24.     {
  25.         return $this->getNombre() . ' :: ' . parent::getNombre();
  26.     }
  27. }
  28.  
  29. $b = new B();
  30. echo $b->getAllNombres(); // Soy B :: Soy A

Si tu clase tiene sus getters y setters puedes entonces usar getMethods de reflection para automatizar eso que quieres hacer, ve este ejemplo:
Código PHP:
Ver original
  1. <?php
  2. class Persona
  3. {
  4.     private $_nombre;
  5.     private $_apellido;
  6.    
  7.     public function __construct($nombre, $apellido)
  8.     {
  9.         $this->setNombre($nombre)
  10.              ->setApellido($apellido);
  11.     }
  12.    
  13.     public function setNombre($nombre)
  14.     {
  15.         $this->_nombre = $nombre;
  16.        
  17.         return $this;
  18.     }
  19.    
  20.     public function getNombre()
  21.     {
  22.         return $this->_nombre;
  23.     }
  24.    
  25.     public function setApellido($apellido)
  26.     {
  27.         $this->_apellido = $apellido;
  28.        
  29.         return $this;
  30.     }
  31.    
  32.     public function getApellido()
  33.     {
  34.         return $this->_apellido;
  35.     }
  36. }
  37.  
  38. class Carpintero extends Persona
  39. {
  40.     private $_serruchos;
  41.    
  42.     public function __construct($nombre, $apellido, $serruchos)
  43.     {
  44.         parent::__construct($nombre, $apellido);
  45.         $this->setSerruchos($serruchos);
  46.     }
  47.    
  48.     public function setSerruchos($serruchos)
  49.     {
  50.         $this->_serruchos = $serruchos;
  51.        
  52.         return $this;
  53.     }
  54.    
  55.     public function getSerruchos()
  56.     {
  57.         return $this->_serruchos;
  58.     }
  59.    
  60.     public function serrucha()
  61.     {
  62.         echo 'serruchando';
  63.     }
  64.    
  65.     public function __toString()
  66.     {
  67.         $R = new ReflectionClass($this);
  68.         $sOutput = '';
  69.         foreach ($R->getMethods() as $Method) {
  70.             if (substr($Method->name, 0, 3) == 'get') {
  71.                 $sOutput .= $Method->invoke($this);
  72.             }
  73.         }
  74.        
  75.         return $sOutput;
  76.     }
  77. }
  78.  
  79. $Juan = new Carpintero('Juan', 'Fulano', 4);
  80. echo $Juan;
  #12 (permalink)  
Antiguo 17/02/2012, 14:49
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 926
Antigüedad: 12 años, 8 meses
Puntos: 269
Respuesta: Obtener variables de una clase

lolocrypto,
No hay relación entre Reflection y el sistema de herencia de clases.Lo que conoce Reflection de las clases, lo toma del parser PHP, no del contexto desde el cual estés llamando a Reflection.Tú puedes hacer reflection de la clase "A", desde "B", o desde cualquier otro sitio.
Reflection te permite examinar el "catálogo de clases" existente en el parser php, no "el contexto actualmente visible".Desde ese catálogo, puedes saber que B deriva de A, pero no porque hayas llamado a Reflection desde B, sino porque cuando se parseó B.php, se introdujo en el catálogo de clases conocidas, con las variables miembro, funciones, etc, que el parser encontró definidas en la clase.

Por lo tanto, es perfectamente normal que desde "B" no veas nada de "A".Es más, hay que tener en cuenta que PHP no te obliga a declarar cada variable miembro de un objeto.La puedes crear en tiempo de ejecución.Aunque no lo he probado, no creo que Reflection sea capaz de devolverte la existencia de esas variables, aunque llamaras desde la propia clase,ya que éstas solo se conocen a nivel de instancia, no a nivel de clase (definicion), que es lo que maneja Reflection

Etiquetas: php, poo
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

SíEste tema le ha gustado a 1 personas




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