Foros del Web » Programando para Internet » PHP »

Ejecutar sentencia desde variable

Estas en el tema de Ejecutar sentencia desde variable en el foro de PHP en Foros del Web. Buenas! Conozco que en PHP se puede hacer algo así: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: Ver original $pinfo = 'phpinfo()' ;   echo $pinfo ; y ...
  #1 (permalink)  
Antiguo 07/01/2014, 02:42
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Ejecutar sentencia desde variable

Buenas!

Conozco que en PHP se puede hacer algo así:

Código PHP:
Ver original
  1. $pinfo = 'phpinfo()';
  2.  
  3. echo $pinfo;

y nos ejecutaría la función "phpinfo()".

No obstante, mi duda es la siguiente: ¿puedo tener una (o varias - array) instrucción y aplicarla a un objeto en si? Quiero decir:

Código PHP:
Ver original
  1. <?php
  2. class miClase{
  3.     private $attr1;
  4.     private $attr2;
  5.  
  6.     public __construct(){
  7.         $instr1 = '$this.attr1=1';
  8.         $instr2 = '$this.attr2=2';
  9.  
  10.         //aquí hacer que $instr1 e $instr2 se "ejecuten" de manera que:
  11.         echo($this.attr1); //debería mostrar "1"
  12.     }
  13. }
  14. ?>

Supongo que con el método "eval()" de PHP se podría, pero no se hasta que punto es posible esto que pretendo...

Gracias desde ya.

Saludos!
  #2 (permalink)  
Antiguo 07/01/2014, 06:03
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Ejecutar sentencia desde variable

no entiendo para que si puedes hacer esto
Código PHP:
<?php
    
class miClase{
        private 
$attr1;
        private 
$attr2;
     
        public 
__construct(){
            
$this.attr1=1;
            
$this.attr2=2;
     
            echo(
$this.attr1); //debería mostrar "1"
        
}
    }
    
?>
que alguien me corrija si me equivoco pero esto no es asi
Código PHP:
 $pinfo 'phpinfo()'//declaraste como strimg phpinfo() y eso es lo que mostrará, solo un string
    
echo $pinfo
por el contrario esto si ejecutará la funcion.
Código PHP:
<?
$pinfo 
='phpinfo();'//
     
    
eval($pinfo);
?>
Para hacer lo que quieres se requiereun eval y una correcta sintaxis

Código PHP:
    <?php
    
class miClase{
        private 
$attr1;
        private 
$attr2;
     
        public 
__construct(){
            
$instr1 '$this.attr1=1;';
            
$instr2 '$this.attr2=2;';
     
           eval(
$instr1); //aquí hacer que $instr1 se "ejecute" de manera que:
            
echo($this.attr1); //debería mostrar "1"
        
}
    }
    
?>
Por razones de seguridad eval no se ocupa mucho a no ser que sepas lo que estas haciendo
  #3 (permalink)  
Antiguo 07/01/2014, 06:48
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: Ejecutar sentencia desde variable

Cierto, me descuidé.

Código PHP:
Ver original
  1. $pinfo = 'phpinfo';
  2. $pinfo();
  3.  
  4. //esto mostraría la función "phpinfo"

Aquí puedes comprobarlo.

Quiero probar lo del eval() por temas de ficheros y consultas externas.

Saludos.
  #4 (permalink)  
Antiguo 07/01/2014, 08:42
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Ejecutar sentencia desde variable

ok, pero como ves eso solo es para enmascarar funciones no para ejevutar codigo.
para ejecutar codigo en una variable como php esta eval
  #5 (permalink)  
Antiguo 07/01/2014, 09:00
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: Ejecutar sentencia desde variable

Cierto.

Entonces, sería posible hacer lo que pretendo?

Es decir, he probado el eval() para funciones simples y asignaciones sencillas, pero nunca dentro de una clase haciendo referencias a si misma...

Gracias de nuevo.
  #6 (permalink)  
Antiguo 07/01/2014, 09:25
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Ejecutar sentencia desde variable

tienes que probar, si funciona bien y si no tambien.
  #7 (permalink)  
Antiguo 07/01/2014, 20:42
Avatar de patriciomase  
Fecha de Ingreso: abril-2012
Ubicación: Mar del Plata
Mensajes: 323
Antigüedad: 12 años
Puntos: 34
Respuesta: Ejecutar sentencia desde variable

Tienes que evitar usar eval(), el 95% de las veces hay una forma mucho mas correcta de hacer "la cosa" que estas tratando de hacer, y sin usar eval()
  #8 (permalink)  
Antiguo 08/01/2014, 05:58
Avatar de enlinea777  
Fecha de Ingreso: mayo-2008
Ubicación: frente al pc
Mensajes: 1.830
Antigüedad: 15 años, 11 meses
Puntos: 127
Respuesta: Ejecutar sentencia desde variable

eval() no es malo solo hay que saber usarlo.
  #9 (permalink)  
Antiguo 08/01/2014, 08:30
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Ejecutar sentencia desde variable

Cuncuerdo con @patriciomase sobre que "eval is evil" el principal problema de usar eval son los programadores inexpertos. Tomemos de ejemplo la clase

Código PHP:
Ver original
  1. <?php
  2. class miClase{
  3.     private $attr1;
  4.     private $attr2;
  5.      
  6.     public function __construct(){
  7.         $instr1 = '$this->attr1 = 1;';
  8.         $instr2 = '$this->attr2 = 2;';
  9.      
  10.         eval($instr1); //aquí hacer que $instr1 se "ejecute" de manera que:
  11.         echo $this->attr1; //debería mostrar "1"
  12.     }
  13. }
  14. ?>

Funciona, si. Es correcto? no. Por qué? porque no tiene sentido. Lo que quieres hacer es muy similar a esto (tomando el ejemplo de la clase):

Código PHP:
Ver original
  1. <?php
  2. class miClase{
  3.     private $attr1;
  4.     private $attr2;
  5.      
  6.     public function __construct($attr){
  7.         $this->setAttr($attr);
  8.         echo $this->attr1;
  9.     }
  10.    
  11.     protected function setAttr($attrs){
  12.         foreach( $attrs as $key => $value ){
  13.             $this->$key = $value;
  14.         }
  15.     }
  16. }
  17.  
  18. new miClase( array('attr1'=>'Hola mundo') );
  19. ?>


Cita:
Iniciado por DoHITB Ver Mensaje
Quiero probar lo del eval() por temas de ficheros y consultas externas.

Saludos.
Puedes dar un ejemplo REAL de lo que quieres hacer? ya que con los ejemplos que pones, nos hace pensar que no sabes realmente programar (con todo el respeto del mundo) y haces que no sepamos guiarte correctamente sobre lo que es mejor. Y si, el 99% de las cosas que normalmente la gente hace con eval se puede evitar .

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #10 (permalink)  
Antiguo 08/01/2014, 09:04
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: Ejecutar sentencia desde variable

Buenas!

Gracias por responder tan de manera tan amplia. Recuerdo hacer algo así como lo que dices tú, pero desconocía que la variable de una clase se pudiera referenciar desde otra variable. En ese caso, yo hacía:

Código PHP:
Ver original
  1. $this->vars = array('var1' => &$this->var1 /*etc*/);

Y entonces usaba $this->vars[$variable] = $valor;

Realmente se programar. Quizás no conozco el 100% de las posibilidades de PHP (como acabo de comentar, por ejemplo, no conocía el "truco" que has mostrado). Tampoco había pensado demasiado la idea de cómo solucionar mi problema (hubiera acabado usando algo similar a lo que dices tú).

Para ser concretos, hay algo como:

Fichero1:
Código:
ClassA;
var1=1;
var2=2;
var3=3;
var4=4;
ClassB;
var1=a
.
.
.
Y lo que quiero es instanciar el objeto a través del contenido del fichero. Se que hay JSON y derivados, pero por la naturaleza del programa que me genera el fichero y por mis (casi) nulos conocimientos de JSON y derivados me es muy difícil hacer servir esta estructura (amén que tampoco se hasta que punto es eficiente usar la notación JSON, ya que si es un framework de ámbito general supongo hará una serie de comprobaciones que puede que a mi no me interesen hacer, haciendo por tanto que mi script php sea más lento...)

Por otra parte, se que mis mensajes en los foros suelen ser crípticos, pues suelo postear conceptos que no son mas que eso: conceptos. Es decir, cuando decía que buscaba saber si se podía hacer lo del eval(), buscaba (literalmente) esa misma respuesta. Se que puede no ser correcto, o no ser eficiente... pero (en este caso) se trata de un ejercicio auto-impuesto para experimetnar con la sentencia "eval()". Ahora que ha surgido tu idea, me plantearé estudiarla, y de nuevo experimentar con el concepto "llamar a la variable de un objeto mediante otra variable", que desde luego me ayudará en un par de desarrollos que tengo a medias...

Un saludo.
  #11 (permalink)  
Antiguo 08/01/2014, 09:20
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Ejecutar sentencia desde variable

Bueno discúlpame pero sigo sin entenderte exactamente que quieres hacer y que papel puede o no puede jugar JSON y lo que te dije.

Poniendote otro ejemplo de llamadas de variables puedes hacer tambien esto (no se si esto te servirá para lo que dices de que Y lo que quiero es instanciar el objeto a través del contenido del fichero)

Código PHP:
Ver original
  1. <?php
  2. $foo = 'bar';
  3.  
  4. $var = 'foo';
  5.  
  6. echo $$var; //imprime bar
  7.  
  8.  
  9. class miClase {
  10.    
  11. }
  12.  
  13. $bar = 'miClase';
  14.  
  15. $clase = new $bar();

Te doy un consejo sin que me lo pidas

Cita:
Por otra parte, se que mis mensajes en los foros suelen ser crípticos,
Te sugiero que trates de ser especifico con lo que pides y dices ya que como el medio de comunicación del foro es el escrito, siempre toca que leer al pie de la letra y tratar de suponer lo menos posible. Ya que la verdad se hace complicado entender y uno puede tomar las cosas por el lado que no es. (juraba y perjuraba que querías usar eval en una aplicación y no como auto ejercicio, donde hubieras dicho eso mi respuesta hubiera sido ligeramente distinta )

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #12 (permalink)  
Antiguo 08/01/2014, 09:40
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: Ejecutar sentencia desde variable

Hola de nuevo,

Lo del JSON lo comento porque (creo) que se podría alterar la manera en la que se recibe el contenido del fichero, digamos:

Código:
{var1:val1;var2:val2}
Creo que la estructura que usa JSON es parecida, y creo recordar que se podía usar en PHP, ¿no? Pero no puedo (o sería muy difícil) obtener esta estructura en mi fichero de entrada.

Por el resto, la segunda parte la conocía (hice el ejemplo - al principio cometí un error - de phpinfo() ), y lo primero entiendo que funciona así:

Código PHP:
Ver original
  1. $foo = 'bar';
  2. $var = 'foo';
  3. $myVar = 'var';
  4.  
  5. echo $$$myVar;
  6.  
  7. /*
  8.   Paso 1: $myVar "retorna" su valor
  9.     echo $$var
  10.  
  11.   Paso 2: $var "retorna" su valor
  12.     echo $foo
  13.  
  14.   Paso 3: $foo "retorna" su valor
  15.     bar
  16. */

Como te digo es lo que supongo que hace (no creo que esté demasiado desencaminado), pero realmente con la parte o bien del eval() o la forma que sugieres tú (el array asociativo en el constructor) podré seguir con mis experimentos.

Para que te hagas una idea de "con lo que juego" puedes echar un vistazo a mi último experimento

JSBIN - eval() y bucle infinito

Un saludo.
  #13 (permalink)  
Antiguo 08/01/2014, 14:25
Avatar de jonni09lo
Colaborador
 
Fecha de Ingreso: septiembre-2011
Ubicación: Estigia
Mensajes: 1.471
Antigüedad: 12 años, 7 meses
Puntos: 397
Respuesta: Ejecutar sentencia desde variable

Pues se puede trabajar perfectamente con JSON desde PHP

Código PHP:
Ver original
  1. $string_json = '{var1:2, var2:3}';
  2. $object_from_json = json_decode($string_json);
  3. $array_from_json  = json_decode($string_json, true);

Viendo tu ejemplo la verdad solo le veo utilidad como para aprender... jejeje igual es bastante interesante

Saludos
__________________
Haz preguntas inteligentes-Como ser Hacker
No hacer preguntas por mensaje privado. No sólo no es inteligente sino que es egoísta.
  #14 (permalink)  
Antiguo 09/01/2014, 11:57
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años
Puntos: 33
Respuesta: Ejecutar sentencia desde variable

Cita:
Iniciado por jonni09lo Ver Mensaje
Pues se puede trabajar perfectamente con JSON desde PHP

Código PHP:
Ver original
  1. $string_json = '{var1:2, var2:3}';
  2. $object_from_json = json_decode($string_json);
  3. $array_from_json  = json_decode($string_json, true);

Viendo tu ejemplo la verdad solo le veo utilidad como para aprender... jejeje igual es bastante interesante

Saludos
Claro, lo de JSON fue lo primero que pensé, pero como te iba diciendo es difícil hacer que el fichero viniese así... aunque se puede intentar jeje

Pues todos mis ejemplos (o la mayoría) son así. Con el que te pasé tendrías una base para hacer un "ofuscador de código", de manera que tú pondrías tu JavaScript como una cadena "churro", que sería procesada por ese simple bucle... jeje

Saludos.

Etiquetas: sentencia, variable
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 17:00.