Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?
21 usuarios Online (0)
Darse de alta en la web | Recuperar password   
Inicio / Foros / PHP / Asignar variables a una clase dinámicamente
4 respuestas recibidas | 207 visitas | Categoría PHP

Asignar variables a una clase dinámicamente

Avatar de SiCk
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 45 posts)

#0 Offline SiCk Usuario 11 mar 08 (11:22)  
Hola.
Veréis, tengo una clase para "renderizar" el html. De momento, le envio un array que contiene las variables que quiero imprimir luego en las plantillas.
El caso es que para hacerlo más sencillo de usar, me gustaría que en lugar de ser un array genérico que contenga los valores, que fueran variables de clase las que contengan los datos a imprimir.
La clase se llama render.
Un ejemplo de como la uso:

Código PHP


render::$salida = ''; //Array con datos de la bd, por ejemplo
render::$salida['titulo'] = 'Ejemplo de "otra" variable más';
render::generar('plantilla_ejemplo')



Como véis, $salida es la variable que uso para enviar los datos, pero me gustaría poder asignar variables al objeto de manera dinámica.
Un ejemplo de lo que os digo:

Código PHP


render::set($salida);
render::set($titulo);
render::generar('plantilla_ejemplo');



Haría un metodo "set" que se encargaría de crearme dichas variables.
Como veis, envío solo la variable, no me importaría tener que enviar nombre también (render::set($titulo,'titulo');) aunque yo creo que es redundante.

Bien, hasta ahora lo que he hecho es: intentar sacar el nombre de la variable como string, para saber con que nombre asignar la variable. Resultado: FAIL. He buscado en varios sitios y hay una función que parece funciona (var_name, creada por un user en el manual php de variable) pero no sé porque me funciona de manera "simple" pero no al llamarla desde una clase. Sabéis alguna otra manera?

Y lo más chungo, crear dinámicamente la variable de clase. He probado con eval() intentando construir la sentencia, ejemplo: self::$ejemplo = 'valor'; (self porque ya estaría en la clase render y valor iría como variable, no como string, es sólo ejemplo). Pero falla también.

La idea es una vez usada, hacer un unset de dicha variable para limpiar la memoria.
Evidentemente, tampoco me sirve declararlas en la clase... ya que tendrá un uso dinámico.

Alguien puede ayudarme/orientarme?

Gracias!

select * from girls where sex='free'

Re: Asignar variables a una clase dinámicamente

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 199 posts)

#1 Offline krowork Usuario 11 mar 08 (13:57)  
Hola Sick,

yo utilizo un objeto Setter, tu objeto de plantilla puede heredar de éste:

Código PHP


<?php
class Setter{
    
private $__x=array();

    function
__construct(){
        return
$this;
    }
    
    function
__call($m, $a){
        if(
count($a)>1) $this->__x[$m]=$a;
        else
$this->__x[$m]=$a[0];
        return
$this;
    }

    function
__get($nm){
        if (isset(
$this->__x[$nm])) return $this->__x[$nm];
        else return
"";
    }
}
?>


De fomar que si pones:

Código PHP


<?php
$a
=new Setter();
$a->titulo($tit)->subtitulo($subtit);
?>


Te creará en el objeto a las propiedades $a->titulo con el valor de $tit y $a->subtitulo con el valor de $subtit. En cada llamada a un método devuelve el objeto para poder concatenar varias llamadas.

Un saludo

http://krowork.blogspot.com

Re: Asignar variables a una clase dinámicamente

Avatar de SiCk
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 45 posts)

#2 Offline SiCk Usuario 11 mar 08 (14:36)  
Hola Krowork.
Tengo un poco de lío, estoy probado la clase, a ver si consigo hacerlo rular. De momento, no me funciona. De manera rápida, así es como lo tengo (he renombrado Setter a asignador):

Código PHP


<?php
require_once('asignador.class.php');

class
render extends asignador
{
//FUNCIONES Y VARIABLES...    
    
public function render_setvar($var, $name)
    {
        
$gen = new asignador();
        return
$gen->$name($var);
    }
// ETC
}
?>



Luego, en la clase que llama al asignador hago esto:

Código PHP


<?php
$prueba
= '123';
render::set($prueba, 'prueba');
render::generar();
?>



Al llegar a escribir ya la plantilla (donde unicamente tengo <?=render::$prueba?>) sale este error:
Fatal error: Access to undeclared static property: render::$prueba in /home/../media/plantillas/modulos/pordefecto.tpl.php on line 1

Muchas gracias por la ayuda!

select * from girls where sex='free'

Re: Asignar variables a una clase dinámicamente

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 199 posts)

#3 Offline krowork Usuario 11 mar 08 (17:56) Valor Valor Valor  
Hola Sick, no se muy bien la función de la clase estática que utilizas. Te pongo un ejemplo de como lo utilizo yo, le pongo el método __toString al Setter y a parte le paso por el contructor el path de el archivo que quiero utilizar como plantilla:

Código PHP


<?php
class Setter{
    
private $__x=array();
    
private $inlude;

    function
__construct($include){
        
$this->include=$include;
        return
$this;
    }
    
    function
__call($m, $a){
        
$this->__x[$m]=$a;
        return
$this;
    }

    function
__get($nm){
        if (isset(
$this->__x[$nm])) return $this->__x[$nm];
        else return
"";
    }
    function
__toString(){
        
//foreach($this->__x as $nm=>$valor){
        //    $$nm=$valor;
        //}
        
include $this->include;
        return
'';
    }
}
?>



En el archivo 'plantilla.temp' tengo:

Código PHP


<html>
<head><title><?=$this->titulo?></title></head>
<body>
<?=$this->body?>
</body>
</html>


solo tengo que hacer:

Código PHP


<?php
$a
=new Setter('plantilla.temp');
$a->titulo('El titulo')->body('El contenido');
echo
$a;
?>


Esto mostraria la plantilla con los contenidos que le hemos dado al objeto.

http://krowork.blogspot.com

Re: Asignar variables a una clase dinámicamente

Avatar de SiCk
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 45 posts)

#4 Offline SiCk Usuario 12 mar 08 (08:49)  
Hola krowork. Estoy intentando "pinchar" en mi clase render tu setter.
De momento, el único problema que tengo es que uso las clases sin instanciar con new (con ::) sobretodo por temas de visibilidad (me gustaría poder usar todas mis clases sin lios de $this de manera rapida y sin news).
Asi que estoy mirando http://es.php.net/manual/es/ref.overload.php donde parece que explican más en detalle como funciona.
Ya postearé aquí los resultados.
Gracias.

EDIT:
Al final lo he apañado metiendo en mi clase render esto:

Código PHP


<?php
    private $datos
= array();

    function
__call($m, $a)
    {        
        (
count($a) > 1) ? $this->datos[$m] = $a : $this->datos[$m] = $a[0]; return $this;
    }

    function
__get($nm)
    {
        if (isset(
$this->datos[$nm])) { return $this->datos[$nm]; } else { return ""; }
    }
?>



Pero la clase render tendré que llamarla creando una nueva instancia new. Por lo que he leído usando el "Paamayim Nekudotayim" (::) no funcionan muchas de los magic methods, asi que será la única clase que instancie en una variable de la aplicación.
Gracias de nuevo por orientar, he aprendido bastante de los methodos mágicos.

EDIT2:
Creo que voy a usar el array static, pero en lugar de hacerlo con el __call y __get voy a hacerme una funcion yo que lo controle, asi podré usar los metodos sin instanciar.

select * from girls where sex='free'

Responder mensaje

Para poder participar debes estar registrado e identificado. Si no estás registrado como usuario de PHP-Hispano, :: Registrar ::
Login / Password   

Web alojada en Zilos

php-hispano.net 2002 - 2008 | XHTML 1.0
Datos Legales | Webmaster