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

Acceder a variables de un objeto en php5

Estas en el tema de Acceder a variables de un objeto en php5 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, Necesito saber si existe una variable dentro de un objeto. El caso es que la variable a la que necesito acceder está ...
  #1 (permalink)  
Antiguo 01/07/2008, 10:53
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Acceder a variables de un objeto en php5

Hola a todos,

Necesito saber si existe una variable dentro de un objeto. El caso es que la variable a la que necesito acceder está dentro de uno de los atributos de la clase que es un array que a su vez contiene más objetos. Es un poco lioso así que os pongo la estructura de la clase y a la que tengo que acceder.

Propiedades de la clase:
Código PHP:
class XML_Node
{
    var 
$_sName '';
    var 
$_sText '';
    var 
$_aAttributes = array();
    var 
$_oParentNode null;

    var 
$_aChildNodes = array();
    var 
$_iChildCount 0;
    var 
$_aChildNameCount = array();
    var 
$_iParentChildInd 0;
    var 
$_iNodeIndex 1;
    var 
$_iNodeDepth 0;
    var 
$_nodeAbsPath '';

    var 
$_bSaveAsCData false;
... 
Estructura a la que necesito acceder:
Código PHP:

object
(XML_Node)#66 (13) {  
  
["_sName"]=>
  
string(6"module"
  
["_sText"]=>
  
string(0""
  
["_aAttributes"]=>
  array(
0) {
  }
  [
"_oParentNode"]=>
  
object(XML_Node)#60 (13) {
    
["_sName"]=>
    
string(7"modules"
    
["_sText"]=>
    
string(0""
    
["_aAttributes"]=>
    array(
0) {
    }
    [
"_oParentNode"]=>
    &
NULL
    
["_aChildNodes"]=>
    array(
2) {
      [
0]=>
      &
object(XML_Node)#61 (14) {
        
["_sName"]=>
        
string(6"module"
        
["_sText"]=>
        
string(0""
        
["_aAttributes"]=>
        array(
0) {
        }
        [
"_oParentNode"]=>
        
object(XML_Node)#60 (13) {
          
["_sName"]=>
          
string(7"modules"
          
["_sText"]=>
          
string(0""
          
["_aAttributes"]=>
          array(
0) {
          }
          [
"_oParentNode"]=>
          &
NULL
          
["_aChildNodes"]=>
          array(
2) {
            [
0]=>
            &
object(XML_Node)#61 (14) {
              
["_sName"]=>
              
string(6"module"
              
["_sText"]=>
              
string(0""
              
["_aAttributes"]=>
              array(
0) {
              }
              [
"_oParentNode"]=>
              *
RECURSION*
              [
"_aChildNodes"]=>
              array(
0) {
              }
              [
"_iChildCount"]=>
              
int(4)
              [
"_aChildNameCount"]=>
              array(
0) {
              }
              [
"_iParentChildInd"]=>
              
int(0)
              [
"_iNodeIndex"]=>
              
int(1)
              [
"_iNodeDepth"]=>
              
int(1)
              [
"_nodeAbsPath"]=>
              
string(21"/modules[1]/module[1]"
              
["_bSaveAsCData"]=>
              
bool(false)
              [
"name"]=>
              array(
1) {
              }
              [
"nameAlias"]=>
              array(
3) {
                [
1]=>
                &
object(XML_Node)#63 (12) {
                  
...
                }
                [
2]=>
                &
object(XML_Node)#64 (12) {
                  
...
                }
                [
3]=>
                &
object(XML_Node)#65 (12) {
                 
...
                }
              }
            }
.... 
Tengo que saber si nameAlias existe o no para actuar de una manera u otra. En php4 haciendo lo siguiente funciona siendo nodo un objeto de la clase XML_Node:

Código PHP:
isset($this->nodo->nameAlias
pero en php5 no me la encuentra y existe tal y como he mostrado en la estructura.

¿Alguien puede ayudarme?

Gracias por adelantado!!
  #2 (permalink)  
Antiguo 01/07/2008, 11:36
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
Respuesta: Acceder a variables de un objeto en php5

Prueba así:
Código PHP:
$alias = isset($this->nodo->nameAlias);
var_dump( isset( $alias ) ); 
Saludos.
  #3 (permalink)  
Antiguo 02/07/2008, 01:35
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceder a variables de un objeto en php5

Hola GatorV,

Gracias por tu respuesta. He probado lo que me has indicado pero el var_dump me devuelve siempre cierto incluso si en lugar de nameAlias accedo a un índice que se que no existe.

Código PHP:
$alias = isset($this->nodo->nameAliassss);
echo 
" aliasssss -> ";
var_dump( isset( $alias ) ); //bool(true) 
¿Sabes otra solución?

Gracias por tu tiempo.
  #4 (permalink)  
Antiguo 02/07/2008, 08:06
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
Respuesta: Acceder a variables de un objeto en php5

¿Mmm haz probado usar SimpleXML en PHP5 para leer tu XML?

Saludos.
  #5 (permalink)  
Antiguo 02/07/2008, 08:17
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceder a variables de un objeto en php5

No lo he probado, de hecho el código ni siquiera lo he hecho yo, es un proyecto ya hecho y que tengo que migrar a PHP5 por eso me extraña que un simple isset me esté dando tantos problemas.
Es más estoy dándole tantas vueltas al tema que ni siquiera se pq el isset funciona en php4 pq haciendo: isset($this->nodo->nameAlias)
siendo nodo un objeto, nameAlias tendría que ser un atributo de este objeto para poder acceder con isset ¿no? y no un índice de un objeto, de un objeto, de un objeto de un atributo del objeto, pff, que lío.

He intentado pasar el objeto a array con get_object_vars y usar un array_key_exists pero claro, estamos en las mismas, nameAlias no es un índice, sino que es el indice, del indice del indice de uno de los índices del array principal.
También he probado con la función property_exists pero tampoco me funciona, estoy desesperadaaaaaaaaa!!!!!!

¿Se te ocurre algo más que pueda probar? yo ya no se que más mirar
  #6 (permalink)  
Antiguo 02/07/2008, 08:21
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceder a variables de un objeto en php5

Ah!! se me olvidaba, las clases que se usa para leer los XML son XML_Node y XML_Tree. Podría mirar de utilizar la que me comentas pero como te he dicho, el proyecto ya está hecho y funciona bien en php4, es un proyecto muy grande como para cambiar clases sin tener ni idea aun de como funciona todo a la perfección e igual me lleva más tiempo cambiar la clase que resolver este problema.

Saludos y gracias!!
  #7 (permalink)  
Antiguo 02/07/2008, 08:38
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
Respuesta: Acceder a variables de un objeto en php5

Mmmm lo que pasa es que con PHP5 para usar isset ahora que recuerdo tu clase debe de implementar el método mágico __isset(), o de lo contrario prueba el objeto, porque no pruebas con empty() para ver si esta o no el nodo.

Saludos.
  #8 (permalink)  
Antiguo 02/07/2008, 08:48
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceder a variables de un objeto en php5

Usar el método mágico ya me lo había planteado, el problema es que entonces siempre que se use un isset para este objeto me lo mirará y no tengo claro en todos los sitios donde se mira el objeto con isset así que podría ser peor el remedio que la enfermedad.
Empty ya lo he usado empty($this->nodo->nameAlias) pero me hace lo mismo que isset, me devuelve false.
No puedo acceder al atributo nameAlias recorriendo toda la estructura del objeto pq ésta puede puede variar ya que se construye dinámicamente.
  #9 (permalink)  
Antiguo 02/07/2008, 08:48
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: Acceder a variables de un objeto en php5

Yo tengo una propuesta más objetosa...

¿Porque no haces un método en la clase XML_NODE que te diga si tiene un determinado hijo? Por ejemplo:

nodo.hasChild("unNodoHijo");

y que el se fije dentro de su array si lo tiene....

También podrias hacer métodos como

nodo.getChild("unNodo");
nodo.addChild(new XML_NODE("pirulin"));

y dentro solo haces un foreach para buscar u obtener... o hasta puedes tener un array asociativo y ya, pero de afuera no te enteras :).

Me parece una solución más objetosa y simple...

Ah! y una recomendación... Creo que pierdes bastante la declaratividad del xml al escribirlo de manera programática... Yo dejaría el objeto XmlNode para parsearlo, pero como no se que quieres hacer, todo bien XD.

Suerte!
__________________
Saludoss
Guille
  #10 (permalink)  
Antiguo 02/07/2008, 08:49
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceder a variables de un objeto en php5

Hay alguna función de php que busque un índice dentro de cualquier estructura, como en mi caso arrays de arrays de arrays?
  #11 (permalink)  
Antiguo 02/07/2008, 09:00
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceder a variables de un objeto en php5

Me parece una buena idea guille_el3, la intentaré, sólo tengo que superar algunos obstáculos como que no he trabajado nunca con XML, estoy haciendo los primeros pasos con php5 y a eso se le suma que el código no es mío y tengo que migrarlo... así que me quedan unas cuantas horas de pruebas jejeje

A que te refieres con que pierdo bastante la declaratividad del xml al escribirlo de manera programática?

Muchas gracias por la ayuda!!!!
  #12 (permalink)  
Antiguo 02/07/2008, 09:03
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: Acceder a variables de un objeto en php5

Puedes hacer un método recursivo, que si no lo encuentra en los hijos del nodo actual, busque en los nodos de cada uno de los hijos... algo así

Código PHP:
public boolean hasChildNode(aNode){
    return 
this.hasDirectChild(aNode) || this.childsHaveNode(aNode);
}

private 
boolean hasDirectChild(aNode){
//Aqui lo buscas en los hijos directos
}

private 
boolean childsHaveNode(aNode){
for(
node as bleh)    //por cada nodo que tenes como hijos
  
if (node.hasChildNode(aNode)) return true;

return 
false;

Eso es un gran pseudo código, el resto te lo dejo a tí ;).
Piensa que los XML son estructuras recursivas, donde cada nodo tiene hijos y esos hijos son nodos que tambien tienen hijos y así sucesivamente. Cuando una estructura es recursiva lo mas natural es recorrerlas recursivamente :).
__________________
Saludoss
Guille
  #13 (permalink)  
Antiguo 02/07/2008, 09:08
 
Fecha de Ingreso: abril-2008
Mensajes: 264
Antigüedad: 16 años
Puntos: 2
Respuesta: Acceder a variables de un objeto en php5

Con lo de declaratividad me refiero a que esto:

Código PHP:
object(XML_Node)#66 (13) {   
  
["_sName"]=> 
  
string(6"module" 
  
["_sText"]=> 
  
string(0"" 
  
["_aAttributes"]=> 
  array(
0) { 
  } 
  [
"_oParentNode"]=> 
  
object(XML_Node)#60 (13) { 
    
["_sName"]=> 
    
string(7"modules" 
    
["_sText"]=> 
    
string(0"" 
    
["_aAttributes"]=> 
    array(
0) { 
    } 
    [
"_oParentNode"]=> 
    &
NULL 
    
["_aChildNodes"]=> 
    array(
2) { 
      [
0]=> 
      &
object(XML_Node)#61 (14) { 
        
["_sName"]=> 
        
string(6"module" 
        
["_sText"]=> 
        
string(0"" 
        
["_aAttributes"]=> 
        array(
0) { 
        } 
        [
"_oParentNode"]=> 
        
object(XML_Node)#60 (13) { 
          
["_sName"]=> 
          
string(7"modules" 
          
["_sText"]=> 
          
string(0"" 
          
["_aAttributes"]=> 
          array(
0) { 
          } 
          [
"_oParentNode"]=> 
          &
NULL 
          
["_aChildNodes"]=> 
          array(
2) { 
            [
0]=> 
            &
object(XML_Node)#61 (14) { 
              
["_sName"]=> 
              
string(6"module" 
              
["_sText"]=> 
              
string(0"" 
              
["_aAttributes"]=> 
              array(
0) { 
              } 
              [
"_oParentNode"]=> 
              *
RECURSION
              [
"_aChildNodes"]=> 
              array(
0) { 
              } 
              [
"_iChildCount"]=> 
              
int(4
              [
"_aChildNameCount"]=> 
              array(
0) { 
              } 
              [
"_iParentChildInd"]=> 
              
int(0
              [
"_iNodeIndex"]=> 
              
int(1
              [
"_iNodeDepth"]=> 
              
int(1
              [
"_nodeAbsPath"]=> 
              
string(21"/modules[1]/module[1]" 
              
["_bSaveAsCData"]=> 
              
bool(false
              [
"name"]=> 
              array(
1) { 
              } 
              [
"nameAlias"]=> 
              array(
3) { 
                [
1]=> 
                &
object(XML_Node)#63 (12) { 
                  
... 
                } 
                [
2]=> 
                &
object(XML_Node)#64 (12) { 
                  
... 
                } 
                [
3]=> 
                &
object(XML_Node)#65 (12) { 
                 
... 
                } 
              } 
            } 
seria algo como:

<module>
<nodoHijo1></nodoHijo1>
<nodoHijo2>
<acaHijoDeHijo>
</acaHijoDeHijo>
</nodoHijo2>
</module>

O sea.. los XML fueron creados para describir cosas :P. Y si los escribes como antes, ya no describen nada, realmente ni siquiera sabes que es un xml si no te fijas bien que hay un par de XML_NODE tirados por ahi...
Pero es solo una manía mia por que el código diga lo que hace XD, no es necesario.
__________________
Saludoss
Guille
  #14 (permalink)  
Antiguo 02/07/2008, 09:16
Avatar de SUSMO  
Fecha de Ingreso: abril-2008
Ubicación: Barcelona
Mensajes: 188
Antigüedad: 16 años
Puntos: 0
Respuesta: Acceder a variables de un objeto en php5

Lo he escrito de esa manera pq es lo que me ha devuelto el var_dump($this->node) como aún no se bien bien que hace el código que estoy tocando lo uso mucho para saber que es lo que tengo que tratar y como yo y los xmls aún no somos amigos lo veo más claro con su estructura jeje

Gracias por el código guille_el3, en fin voy a ponerme a ver si me hago amiga de los xml XDDD

Muchas gracias a los dos por la ayuda!!!!
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 08:23.