Foros del Web » Programando para Internet » PHP »

Duda con clases y SimpleXML

Estas en el tema de Duda con clases y SimpleXML en el foro de PHP en Foros del Web. Buenas, tengo un par de dudas, aquí os las dejo a ver si me sabéis responder: ¿Cuándo extender una clase? Es decir, ¿debo extender una ...
  #1 (permalink)  
Antiguo 24/02/2011, 12:19
Avatar de Pedro_valencia  
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 82
Antigüedad: 16 años, 4 meses
Puntos: 6
Duda con clases y SimpleXML

Buenas, tengo un par de dudas, aquí os las dejo a ver si me sabéis responder:

  • ¿Cuándo extender una clase?
Es decir, ¿debo extender una clase siempre que necesite algún método de la otra? o ¿sólo si guardan relación?

  • ¿Cómo extender una clase con varias?
Hay veces que necesito los métodos de varias clases dentro de otra clase, ¿cómo hago para extender la clase A, con los métodos de la clase B y la clase C.

  • ¿Cómo inserto un nuevo item en un XML que he cargado?
Es decir, tengo una clase llama Artistas, en esa clase hay una función llamada getImage() que consulta la API de Bing para devolver una imagen.
Lo devuelve mediante json, yo uso json_decode y luego recorro los elementos y la función lo devuelve:
Código PHP:
return $this->img->SearchResponse->Image->Result 
Luego tan sólo debo hacer esto:

Código PHP:
$img $o->getImage();
echo 
$img[0]->MediaUrl
Y muestra la URL correspondiente al item [0].

Bien, sigamos, tengo otra función llamada getData() que devuelve los datos de otra API, esta los devuelve mediante xml y hago esto:

Código PHP:
$this->xml simplexml_load_file("xxx");
return 
$this->xml->artist
Como veis recorro un elemento y avanzo a artist.

Bien, ahora el asunto principal, lo que quiero es insertar un item ahí, es decir,
si haces un var_dump($this->xml->artist); te devuelve el XML con los items, por ejemplo:

object(stdClass)[7]
public 'Title' => string 'Foo Fighters | Música y Artistas' (length=33)
public 'MediaUrl' => string 'http://www.musicaartistas.com/wp-content/uploads/data/f/foo-fighters/foo-fighters.jpg' (length=85)
public 'Url' => string 'http://www.musicaartistas.com/musica-artistas/foo-fighters' (length=58)
public 'DisplayUrl' => string 'http://www.musicaartistas.com/musica-artistas/foo-fighters' (length=58)
public 'Width' => int 575
public 'Height' => int 450
public 'FileSize' => int 70129

Yo quiero añadir un item con la ruta de la imagen, es decir, algo como:

public 'image' => string 'RutaDeLaImagen' (length=58)

Y he probado algunas cosas pero no han funcionado, ¿tenéis alguna idea?

Un saludo y gracias!
__________________
Si te ha servido mi post, ¡dame Karma, es gratis!

- ¿Qué es el éxito? Lo diferente.
  #2 (permalink)  
Antiguo 24/02/2011, 12:52
Avatar de Patriarka  
Fecha de Ingreso: enero-2011
Ubicación: Moreno, Buenos Aires, Argentina
Mensajes: 2.851
Antigüedad: 13 años, 2 meses
Puntos: 288
Respuesta: Duda con clases y SimpleXML

vas a tener que usar interfaces amigo
  #3 (permalink)  
Antiguo 24/02/2011, 13:57
 
Fecha de Ingreso: octubre-2009
Mensajes: 245
Antigüedad: 14 años, 6 meses
Puntos: 17
Respuesta: Duda con clases y SimpleXML

Cita:
¿Cuándo extender una clase?
La herencia se usa cuando hay relaciones padre-hijo entre objetos y los hijos son especializaciones del padre, eso lo averiguas cuando haces tu modelo del dominio.

Cita:
¿Cómo extender una clase con varias?

Hay veces que necesito los métodos de varias clases dentro de otra clase, ¿cómo hago para extender la clase A, con los métodos de la clase B y la clase C.
Primero no hay herencia múltiple en php, pero si quieres implementar algo como lo que necesitas, solo hay de comportamiento y lo haces implementado interfaces.
Ahora la herencia no se usa para extender clases de las cuales necesitas sus métodos así nada mas por que el lenguaje lo permite, si haces eso vas camino al desastre mejor analiza tu modelo, recuerda que los objetos al igual que en el mundo real tienen comportamiento bien definido y se comunican entre si, mejor piensa como pueden colaborar esos objetos para obtener el comportamiento que esperas.
Como detalle adicional lee un poco de Diseño orientado a objetos y patrones GRASP para que vayas viendo el uso de responsabilidades.

Cita:
¿Cómo inserto un nuevo item en un XML que he cargado?
http://www.php.net/manual/en/book.dom.php
__________________
Saludos.
  #4 (permalink)  
Antiguo 24/02/2011, 14:23
Avatar de Pedro_valencia  
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 82
Antigüedad: 16 años, 4 meses
Puntos: 6
Respuesta: Duda con clases y SimpleXML

Ya he conseguido hacerlo, he usado la clase SimpleXML y addChild.

Aún así tengo la duda de que decís que use interfaces, pero según tengo entendido las interfaces son básicamente clases abstractas que según entiendo es una forma de seguir correctamente la jerarquía definiendo el método pero sin codificarlo, eso se hace luego en las clases que lo extiendan o implementen (si hablamos de interfaces).

Pero no veo la utilidad si lo que necesitas es métodos de la clase A y métodos de la clase B en la clase C.

Por ejemplo, imaginaros que necesito métodos de la API de Bing (clase A) y métodos de la API de Twitter (clase B) en mi clase (clase C) que recoge los datos de las otras dos clases, los junta y los devuelve.


No entiendo la forma de hacer eso usando interfaces, ya que según entiendo estas sirven para cuando dos clases tienen métodos en común pero otros que debe actuar según la clase.

¿Podéis poner un ejemplo de interfaces con el ejemplo que os he puesto en negrita?
__________________
Si te ha servido mi post, ¡dame Karma, es gratis!

- ¿Qué es el éxito? Lo diferente.

Última edición por Pedro_valencia; 24/02/2011 a las 15:05
  #5 (permalink)  
Antiguo 24/02/2011, 17:57
 
Fecha de Ingreso: octubre-2009
Mensajes: 245
Antigüedad: 14 años, 6 meses
Puntos: 17
Respuesta: Duda con clases y SimpleXML

Cita:
Por ejemplo, imaginaros que necesito métodos de la API de Bing (clase A) y métodos de la API de Twitter (clase B) en mi clase (clase C) que recoge los datos de las otras dos clases, los junta y los devuelve.
Ya veo cual es el problema. En este caso si quisieras implementar una clse C mediante interfaces tendrías que extender e implementar las interfaces de A y B si es que existen.
Pero no creo que necesites herencia para hacer uso de los métodos de A y B. Mas bien tienes relaciones de dependencia. asi que pasa instancias de A y B a tu objeto C y realiza con ellas lo que necesita C para realizar su comportamiento.

Cita:
¿Podéis poner un ejemplo de interfaces con el ejemplo que os he puesto en negrita?
No aplica ejemplo si A y B no son abstractas.
__________________
Saludos.
  #6 (permalink)  
Antiguo 24/02/2011, 18:55
Avatar de Pedro_valencia  
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 82
Antigüedad: 16 años, 4 meses
Puntos: 6
Respuesta: Duda con clases y SimpleXML

Edito: Bien ya he solucionado eso instanciando la clase desde fuera y declarandola como global en un método, cosa que no sabía que se podía hacer o no sé si será una buena práctica.
__________________
Si te ha servido mi post, ¡dame Karma, es gratis!

- ¿Qué es el éxito? Lo diferente.

Última edición por Pedro_valencia; 24/02/2011 a las 19:15
  #7 (permalink)  
Antiguo 24/02/2011, 21:08
 
Fecha de Ingreso: octubre-2009
Mensajes: 245
Antigüedad: 14 años, 6 meses
Puntos: 17
Respuesta: Duda con clases y SimpleXML

Te dejo un ejemplo de como puedes hacerlo

Código PHP:
Ver original
  1. class A{
  2.     public function doA(){
  3.         echo "Objeto A";
  4.     }
  5. }
  6.  
  7. class B{
  8.     public function doB(){
  9.         echo "Objeto B";
  10.     }
  11. }
  12.  
  13. class C{
  14.     private $objectA;
  15.     private $objectB;
  16.  
  17.     public function add(A $a, B $b){
  18.         $this->objectA = $a;
  19.         $this->objectB = $b;
  20.     }
  21.  
  22.     public function doC(){
  23.         echo $this->objectA->doA() . "<br/>";
  24.         echo $this->objectB->doB();
  25.     }
  26. }
  27.  
  28. $c = new C();
  29. $c->add(new A(), new B());
  30. $c->doC();
__________________
Saludos.

Etiquetas: clases, simplexml
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 19:05.