Mailinglisten-Archive |
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