phpbar.de logo

Mailinglisten-Archive

[php] eval("global $lalala");

[php] eval("global $lalala");

tc77 php_(at)_phpcenter.de
Sun, 16 Jun 2002 17:26:52 +0200


Hi Jungs und Mädels,

ich krieg' hier gerade graue haare und weiss einfach nicht mehr
weiter. ich bin gerade dabei eine funktion zum serialisieren von
variablen und objekten zu schreiben, doch leider will das ding nicht
wie ich will. trotz 10.000 fachem durch den kopp gehen lassen habe ich
keine lösung gefunden...

das problem liegt in der 16. zeile bei eval("global \$$var;");. php
meldet sich die ganze zeit mit einem parse error:
"Parse error: parse error, expecting `','' or `';'' in
/server/zero7.local/www/serialize2.php(16) : eval()'d code on line 1".
der eval-ausdruck ist aber korrekt! ;)

wenn ich nun den eval durch ein "global $arr_foo, $obj_foo;",
wie ja die testvariable und das objekt heissen, ersetze, dann funzt die
ganze sache prächtig. die verwendung von variablen variablen ohne eval
funktioniert leider auch nicht, denn spätestens beim serialisieren des
arrays und der rekursiven serialisierung der strings "vergisst" php
die werte!?

vielleicht habe ich ja tomaten auf den augen und jemand von euch weiss
rat.

cu tc77

-- start code snippet --
<?php
   /** 
      Hardcore Error Reporting aktivieren 
   */ 
   error_reporting (2047); 

   function tc_serialize($var, &$str) 
   { 
      // Variablennamen aus Objekten und Array extrahieren 
      if (preg_match("=^(\$[\w_]*)(->([\w_]*)|\['([\w_']*)'\])=", $var, $arr_matches)) 
      { 
         eval("global \$$arr_matches[1];"); 
      } 
      else 
      { 
         eval("global \$$var;"); 
      } 

//      eval("global \$$var;"); 
//      global $arr_foo, $obj_foo; 
       
      eval("\$str_type = gettype(\$$var);"); 
       
      switch ($str_type) 
      { 
          
         /** 
            Die Variable representiert ein Array. 
         */ 
         case "array": 
            $str .= sprintf("\$%s = array(); ", $var); 

            eval("\$count = count(\$$var);"); 
            for($i=0; $i < $count; $i++) 
            { 
               $str_var = sprintf("%s['%s']", $var, tc_escape($i)); 
               eval("echo(\"m: \".$$str_var.\"<br>\");"); 
               tc_serialize($str_var, $str); 
            } 
         break; 

         case "object": 
            eval("\$key = get_class(\$$var);"); 

            $str .= sprintf("\$%s = new %s; ", $var, $key); 

            /** 
               This function will return an associative array of default properties of the class. 
               The resulting array elements are in the form of varname => value. 
            */ 
            $arr_properties = get_class_vars($key); 
             
            reset($arr_properties); 
            while (list($key, $value) = each($arr_properties)) 
            { 
               $str_var = sprintf("%s->%s", $var, $key); 
               tc_serialize($str_var, $str); 
            } 

            /** 
               This function returns an array of method names defined for the class specified 
               by class_name. 
            */ 
//            $arr_methods = get_class_methods($key); 

         break; 

         default: 
            eval("\$value = tc_escape(\$$var);"); 
            $str .= sprintf("\$%s = '%s'; ", $var, $value); 
         break; 
      } 
   } 
    
   function tc_escape($string) 
   { 
      return ereg_replace("([\\'])", "\\\\1", $string); 
   } 
    
   class foo 
   { 
      var $bar = "auto"; 
       
      function foobar() 
      { 
         echo("x"); 
      } 
   } 
    
   $str_serialization = ""; 

   $str_foo = "test"; 
   $str_foo2 = "lalalala"; 
   $arr_foo = array("auto", "haus", "pferd", "yacht"); 
   $obj_foo = new foo; 

//   tc_serialize("str_foo", $str_serialization); 
//   tc_serialize("str_foo2", $str_serialization); 
   tc_serialize("arr_foo", $str_serialization); 
   tc_serialize("obj_foo", $str_serialization); 

   echo("<br><font face=arial size=2>".$str_serialization."</font><br>"); 

?> 

-- end code snippet --


php::bar PHP Wiki   -   Listenarchive