2011-01-10 15 views
1

Hier ist der Deal. Ich versuche, eine Funktion zu machen, die ein Objekt zurückgibt. Etwas wie folgt aus:Übergeben von Parametern an den Klassenkonstruktor aus einer Wrapper-Funktion

function getObject($objectName) { 
    return new $objectName() ; 
} 

aber ich muss noch params der Klasse Konstruktor übergeben, würde einfachste Lösung für die Funktion ein Array übergeben werden, wie folgt aus:

function getObject($objectName, $arr = array()) { 
    return new $objectName($arr) ; 
} 

Aber dann muss ich die Klasse Konstruktor hatte nur 1 Argument und genau Array, was unerwünscht ist, denn ich möchte diese Funktion für jede Klasse verwenden können. Hier ist die Lösung, die ich zu mir kam:

/** 
* Test class 
*/ 
class Class1 { 
    /** 
    * Class constructor just to check if the function below works 
    */ 
    public function __construct($foo, $bar) { 
     echo $foo . ' _ ' . $bar ; 
    } 
} 

/** 
* This function retrns a class $className object, all that goes after first argument passes to the object class constructor as params 
* @param String $className - class name 
* @return Object - desired object 
*/ 
function loadClass($className) { 
    $vars = func_get_args() ; // get arguments 
    unset($vars[ 0 ]) ; // unset first arg, which is $className 
    // << Anonymous function code start >> 
    $code = 'return new ' . $className . '(' ; 
    $auxCode = array() ; 
    foreach($vars as $val) 
     $auxCode[] = 'unserialize(stripslashes(\'' 
     .    addslashes((serialize($val))) . '\'))' ; 
    $code .= implode(',', $auxCode) . ');' ; 
    // << Anonymous function code end >> 
    $returnClass = create_function('', $code) ; // create the anonymous func 
    return $returnClass($vars) ; // return object 
} 

$obj = loadClass('Class1', 'l\'ol', 'fun') ; // test 

Nun, es funktioniert genauso, wie ich will, aber sieht ein bisschen ungeschickt zu mir. Vielleicht erfinde ich das Rad neu und es gibt eine andere Standardlösung oder etwas für diese Art von Problem?

Antwort

5

können Sie ReflectionClass verwenden, um dies leicht zu erreichen:

function getObject($objectName, $arr = array()) { 
    if (empty($arr)) { 
     // Assumes you correctly pass nothing or array() in the second argument 
     // and that the constructor does accept no arguments 
     return new $objectName(); 
    } else { 
     // Similar to call_user_func_array() but on an object's constructor 
     // May throw an exception if you don't pass the correct argument set 
     // or there's no known constructor other than the default (arg-less) 
     $rc = new ReflectionClass($objectName); 
     return $rc->newInstanceArgs($arr); 
    } 
} 
+1

Sweet! Reflexion ... gibt es etwas, was es NICHT tun kann ?! :) – kander

+0

Vielen Dank! Ich war mir ziemlich sicher, dass es den Weg gibt, ReflectionClass zu verwenden, aber ich habe nicht tief genug gegraben. Verdammte Docs sind ein Durcheinander. – kos

+0

@ k0stix: Ja, leider :(Denken Sie daran, auf das Häkchen zu klicken, um eine Antwort zu akzeptieren (dies ist nur Ihre zweite Frage, damit ich Sie wissen lasse). – BoltClock

Verwandte Themen