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

Pierdo variables usando una clase dentro de otra

Estas en el tema de Pierdo variables usando una clase dentro de otra en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenos días, Estoy empollándome esto de las clases en PHP y por lo visto se me ha escapado algo. Tengo dos clases, una con una ...
  #1 (permalink)  
Antiguo 21/04/2010, 19:42
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Pierdo variables usando una clase dentro de otra

Buenos días,

Estoy empollándome esto de las clases en PHP y por lo visto se me ha escapado algo. Tengo dos clases, una con una función que me genera una cadena de texto y otra clase con una función que busca una cadena de texto en un texto más grande y la sustituye por la cadena generada por la primera clase.

El problema está en que todo funciona correctamente salvo porque las variables por las que está formada la primera cadena no aparecen. Se quedan en blanco.

El archivo es el siguiente:

Código PHP:
<?php

class Flickr {

    private 
$apiKey 'c933e0d66a6695d005d660392bc496f2';

    public function 
img($id)
    {
        
$url 'http://www.flickr.com/services/rest/?api_key=' $this->apiKey '&format=php_serial&method=flickr.photos.getInfo&photo_id=' $id;

        
$resultado file_get_contents($url);
        
$resultado unserialize($resultado);
        
$foto $resultado[photo];

        
$foto_url 'http://farm' $foto[farm] . '.static.flickr.com/' $foto[server] . '/' $foto[id] . '_' $foto[secret] . $tam '.jpg';

        
$foto '<a href="' $foto[urls][url][0][_content] . '"><img src="' $foto_url '" alt="' $foto[title][_content] . '" /></a>';

        return 
$foto;
    }

}

$flickr = new Flickr();



class 
BBcode {

    function 
__construct(&$flickr)
    {
        
$this->flickr =& $flickr
    }

    function 
procesar($texto){

        
$a "/\[img\](.*?)\[\/img\]/is";

        
$b "$1";
        
$b $this->flickr->img($b);

        
$texto preg_replace($a$b$texto);

        return 
$texto;
    }
}

$texto  'Imagen 1:<br />';
$texto .= '[img]4398563145[/img]<br />';
$texto .= 'Imagen 2:<br />';
$texto .= '[img]4334520973[/img]';

echo 
'<br /><br />';

$bbcode = new BBcode($flickr);

echo 
$bbcode->procesar($texto);

?>
Y esto me devuelve lo siguiente:

Código HTML:
Imagen 1:<br /><a href=""><img src="http://farm.static.flickr.com//_.jpg" alt="" /></a><br />Imagen 2:<br /><a href=""><img src="http://farm.static.flickr.com//_.jpg" alt="" /></a> 
A ver si alguien sabe qué es lo que he hecho mal y puede echarme un cable.

Un saludo.

Última edición por calamarjoe; 21/04/2010 a las 19:47
  #2 (permalink)  
Antiguo 21/04/2010, 19:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

Lo que pasa es que en lugar de usar preg_replace, debes de usar preg_replace_callback para que se evalue el texto y extraer las ids y procesarlas con tu primera clase.

Saludos.
  #3 (permalink)  
Antiguo 21/04/2010, 19:53
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

Gracias por la respuesta tan rápida.

Mmmm... estoy mirando y no consigo acertar a usar preg_replace_callback(). No entiendo exactamente como debería de usarla aquí.
  #4 (permalink)  
Antiguo 21/04/2010, 19:55
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

Tienes que usarlo con tu segundo parámetro para pasarle un objeto valido del tipo callback donde llames a la función img de tu clase Flickr y con eso se pasa el id que hace match en tu patrón.

Saludos.
  #5 (permalink)  
Antiguo 21/04/2010, 20:02
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

Buf, no me sale. ¿Podrías poner un ejemplo o algo?

Creo que me iré a dormir un rato a ver si mañana me inspiro.
  #6 (permalink)  
Antiguo 21/04/2010, 20:31
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

En este post hay un ejemplo: http://www.forosdelweb.com/f18/preg_...ulares-797729/
  #7 (permalink)  
Antiguo 22/04/2010, 07:14
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

No se si he acabado de entenderlo. La teoría la entiendo, pero a la hora de implementarlo no sé cómo debería ser exactamente.

Lo he dejado de la siguiente manera:
Código PHP:
class BBcode {

    function 
__construct(&$flickr)
    {
        
$this->flickr =& $flickr;
    }

    function 
procesar($texto)
    {
        global 
$flickr;

        
$a "/\[img\](.*?)\[\/img\]/is";

        
//$b = $this->flickr->img("$b");

        
$texto preg_replace_callback($a, array($this->flickr'img("$b")'), $texto);

        return 
$texto;
    }

Me devuelve el mismo texto que tengo, sin sustituír las cadenas de texto :(

A parte del link que me dejaste miré [URL="http://www.forosdelweb.com/f68/preg_replace_callback-clase-718725/"]este post[/URL] y revisé el manual de PHP pero no consigo aclararme.
  #8 (permalink)  
Antiguo 22/04/2010, 08:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

El segundo parámetro es solamente la función que quieres llamar de tu clase, sin parámetros ni nada, revisa en el manual como es el tipo callback.

En el enlace que te deje viene muy bien puesto como es que tienes que llamar a la función si lo quieres hacer con una instancia de la clase.

Saludos.
  #9 (permalink)  
Antiguo 22/04/2010, 08:30
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

Claro, pero tengo que pasar parámetros, sino no tiene sentido llamar a la función.
Para que me genere la imagen tengo que pasarle el identificador. El problema es el cómo paso el identificador.
  #10 (permalink)  
Antiguo 22/04/2010, 09:17
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 15 años, 11 meses
Puntos: 2534
Respuesta: Pierdo variables usando una clase dentro de otra

Cita:
Iniciado por calamarjoe Ver Mensaje
Claro, pero tengo que pasar parámetros, sino no tiene sentido llamar a la función.
Para que me genere la imagen tengo que pasarle el identificador. El problema es el cómo paso el identificador.
cual identificador??

recuerda que la función calllback se ejecuta en determinado contexto, si usas como función una llamada a algún método de tu mismo objeto.... pues.... es el mismo objeto!!

no necesitas pasar nada... lo único que se pasa a dicha función es un arreglo con los matches de la expresión... y solo eso...

por favor, consulta el manual
http://php.net/preg_replace_callback
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #11 (permalink)  
Antiguo 22/04/2010, 09:35
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

Exacto si lees el manual puedes ver que preg_replace_callback automaticamente envia como primer parámetro a tu función callback el array con los matches.

Pero NO es necesario definirlo como parte del callback, ya que el tipo Callback es un tipo especial de datos de PHP y solo es necesario definir la función.

Es decir, tu pones que llame a array($foo, 'bar') PHP va a evaluar y va a hacer esto $foo->bar($matches);

Saludos.
  #12 (permalink)  
Antiguo 22/04/2010, 09:40
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

Claro, pero en la primera clase (Flickr) cuando llamas a la función img necesitas pasarle un $id para que te devuelva el resultado.

En la segunda clase (BBcode), en la función procesar, primero busca el patrón (que es lo que me estais diciendo y eso ya funciona) y luego llama al primer objeto para hacer uso de su función img, la cual necesita un $id, que es la cadena que obtiene al pasar el patrón. Por tanto, si no paso ese $id la función img no puede funcionar.

Estamos hablando de cosas diferentes, creo.
  #13 (permalink)  
Antiguo 22/04/2010, 09:48
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

No, lo que pasa es que tu tienes que pasarle el $id que haces del match del patrón, es decir tu patron hace matches de [img][/img] extrae el id y quieres que lo pase a tu clase Flickr.

Para que eso funcione tienes es FORZOSO que uses preg_replace_callback(), para que se llame por cada reemplazo a tu funcion y regrese el resultado.

Saludos.
  #14 (permalink)  
Antiguo 22/04/2010, 09:58
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

Finalmente me ayudó un colega a solucionarlo. En ningún momento usó la función preg_replace_callback() y funciona a la perfección.

Así ha quedado:
Código PHP:
<?php 

class Flickr 

    private 
$apiKey 'c933e0d66a6695d005d660392bc496f2'

    public function 
img($id
    { 
        
$url 'http://www.flickr.com/services/rest/?api_key=' $this->apiKey '&format=php_serial&method=flickr.photos.getInfo&photo_id=' $id

        
$resultado file_get_contents($url); 
        
$resultado unserialize($resultado); 
        
$foto $resultado[photo]; 

        
$foto_url 'http://farm' $foto[farm] . '.static.flickr.com/' $foto[server] . '/' $foto[id] . '_' $foto[secret] . $tam '.jpg'

        
$foto '<a href="' $foto[urls][url][0][_content] . '"><img src="' $foto_url '" alt="' $foto[title][_content] . '" /></a>'

        return 
$foto
    } 



$flickr = new Flickr(); 



class 
BBcode 

    function 
__construct(&$flickr
    { 
        
$this->flickr =& $flickr;  
    } 

    function 
procesar($texto){ 

        
$a "/\[img\](.*?)\[\/img\]/is";  

        
preg_match_all($a$texto$matches);
        
        for(
$i 0$i count($matches[0]); $i++) { // matches[0] -> la línea completa, matches[1] -> el grupo capturado
            
$real_deal $this->flickr->img($matches[1][$i]);
            
$texto str_replace($matches[0][$i], $real_deal$texto); // replaceamos y listo
        
}
        
        return 
$texto
    } 


$texto  'Imagen 1:<br />'
$texto .= '[img]4398563145[/img]<br />'
$texto .= 'Imagen 2:<br />'
$texto .= '[img]4334520973[/img]'

$bbcode = new BBcode($flickr); 

echo 
$bbcode->procesar($texto); 

?>
  #15 (permalink)  
Antiguo 22/04/2010, 10:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

Te hubiera quedado más limpio usando preg_replace_callback pero bueno...
  #16 (permalink)  
Antiguo 22/04/2010, 11:45
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

Cita:
Iniciado por GatorV Ver Mensaje
Te hubiera quedado más limpio usando preg_replace_callback pero bueno...
Es posible, pero aún no se cómo hacerlo. Por mucho que me digais que lea el manual de PHP (cosa que he hecho 20 veces) no consigo entenderlo.

De verdad aprecio vuestra ayuda, pero a falta de que alguien me ayude con preg_replace_callback() con lo explicado arriba lo dejaré así, que al menos funciona.
  #17 (permalink)  
Antiguo 22/04/2010, 11:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

Código PHP:
Ver original
  1. <?php  
  2.  
  3. class Flickr {  
  4.  
  5.     private $apiKey = 'c933e0d66a6695d005d660392bc496f2';  
  6.  
  7.     public function img($id)  
  8.     {  
  9.         $url = 'http://www.flickr.com/services/rest/?api_key=' . $this->apiKey . '&format=php_serial&method=flickr.photos.getInfo&photo_id=' . $id;  
  10.  
  11.         $resultado = file_get_contents($url);  
  12.         $resultado = unserialize($resultado);  
  13.         $foto = $resultado[photo];  
  14.  
  15.         $foto_url = 'http://farm' . $foto[farm] . '.static.flickr.com/' . $foto[server] . '/' . $foto[id] . '_' . $foto[secret] . $tam . '.jpg';  
  16.  
  17.         $foto = '<a href="' . $foto[urls][url][0][_content] . '"><img src="' . $foto_url . '" alt="' . $foto[title][_content] . '" /></a>';  
  18.  
  19.         return $foto;  
  20.     }  
  21.  
  22. }  
  23.  
  24. $flickr = new Flickr();  
  25.  
  26.  
  27.  
  28. class BBcode {  
  29.  
  30.     function __construct(&$flickr)  
  31.     {  
  32.         $this->flickr =& $flickr;  
  33.     }  
  34.  
  35.     function procesar($texto){  
  36.  
  37.         $a = "/\[img\](.*?)\[\/img\]/is";  
  38.  
  39.         $texto = preg_replace_callback($a, array($this, 'process_img'), $matches);
  40.          
  41.         return $texto;  
  42.     }
  43.    
  44.     public function process_img($matches)
  45.     {
  46.         $img_id = $matches[1];
  47.         $this->flickr->img($img_id);
  48.     }
  49. }  
  50.  
  51. $texto  = 'Imagen 1:<br />';  
  52. $texto .= '[img]4398563145[/img]<br />';  
  53. $texto .= 'Imagen 2:<br />';  
  54. $texto .= '[img]4334520973[/img]';  
  55.  
  56. $bbcode = new BBcode($flickr);  
  57.  
  58. echo $bbcode->procesar($texto);
  #18 (permalink)  
Antiguo 22/04/2010, 12:01
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

No me funciona :S

Última edición por calamarjoe; 22/04/2010 a las 12:31
  #19 (permalink)  
Antiguo 22/04/2010, 14:25
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

Creo el indice es $matches[0] prueba cambiarlo
  #20 (permalink)  
Antiguo 22/04/2010, 18:13
 
Fecha de Ingreso: abril-2010
Mensajes: 10
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Pierdo variables usando una clase dentro de otra

No es eso, ya lo había probado. Al igual que cambiar el $matches de
Código PHP:
$texto preg_replace_callback($a, array($this'process_img'), $matches); 
por $texto.
  #21 (permalink)  
Antiguo 23/04/2010, 08:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 10 meses
Puntos: 2135
Respuesta: Pierdo variables usando una clase dentro de otra

Perdon si es $matches[0] en el callback y en la linea es: $texto = preg_replace_callback($a, array($this, 'process_img'), $texto);

En la firma de preg_replace_callback es:
Código:
preg_replace_callback($pattern, $callback, $subject)

Etiquetas: clase, pierdo, variables
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:28.