6. Februar 2012: Ich habe festgestellt, dass die Funktionen nicht wirklich gebraucht werden. Dasselbe geht ja auch mit varialen Klassennamen. Ich lasse die Funktionen trotzdem mal stehen - interessant sind sie immer noch
$className = 'Testclass'; //Beide Zeile machen dasselbe. Die Zweite ist das Beispiel mit meiner Funktion (siehe weiter unten) $obj = new $className('foo', 'bar'); $obj = create_user_object($className, 'foo', 'bar');
Analog zu call_user_func und call_user_func_array kann man mit diesen Funktionen ein Object aus einer Benutzerdefinierten Klasse erstellen
<?php /** * mpl by ERB software * @author stefan.erb(at)erb-software.com */ /** * erstellt ein Object einer Klasse mit dem einer freien Anzahl Paramtern * @param String $className * @param Variant * @return Object * * @example $obj = create_user_obj('myClass', $paramter1, $paramter2); */ function create_user_object($className){ $params = func_get_args(); $className = array_shift($params); return create_user_object_array($className, $params); } /** * erstellt ein Object einer Klasse mit dem Array $params als Argumente * @param String $className * @param Array $params * @return Object * * @example $obj = create_user_obj('myClass', array($paramter1, $paramter2)); */ function create_user_object_array($className, $params = array()){ $pStrings = $params = array_values($params); array_walk($pStrings, create_function('&$item, $key', '$item = "\$params[{$key}]";')); $php = 'return new $className(' . implode(',', $pStrings) . ');'; return eval($php); } ?>
Anwendungsbeispiel
<?php include_once('../lib/functions/createUserObject.php'); $className = 'Testclass'; $classPhp = <<<EOT class {$className}{ public function __construct(\$foo, \$bar){ \$this->foo = \$foo; \$this->bar = \$bar; } public function foobar(){ return \$this->foo . \$this->bar; } } EOT; eval($classPhp); $obj = create_user_object($className, 'foo', 'bar'); echo $obj->foobar(); ?>