abstrahierte Objekterstellung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • abstrahierte Objekterstellung

    Ich habe ein Problem damit, Objekte anhand von Strings die den Namen der dazugehörigen Klasse bezeichnen, zu erstellen.

    Ansicht ist ein konstrukt wie unten aufgeführt ja möglich.
    PHP-Code:
    $foo = new $foo(); 
    Allerdings möchte ich dies jetzt in einem Erstellungs-Entwurfsmuster anwenden.
    Meine factory Methode bekommt den Namen der Klasse als String im ersten Parameter überliefert.
    Soweit kein Problem.

    Jetzt kann diese Klasse allerdings noch mit einer variablen Anzahl von Parametern aufgerufen werden. Diese werden als weitere Parameter an die factory Methode übergeben und mit func_get_args() als array eingesammelt.

    Als Ausgangsstellung habe ich also zwei Variablen:
    string $classname Name der zu instanzierenden Klasse
    array $parameters Array in dem die Parameter für den Konstruktor der Klasse enthalten sind.

    Das Problem besteht darin, die Parameter wieder als variable anzahl von Parametern weiterzugeben.

    Würde ich eine Methode eines bereits bestehenden Objekts aufrufen, wäre dies ja mit call_user_func_array() möglich.
    Leider kann ich aber nicht den konstruktor direkt aufrufen (bzw. er liefert mir dann einfach kein Objekt zurück).

    Auch die methode newInstance() der neuen Reflection API verhält sich nur so wie call_user_func, nicht wie call_user_func_array.
    Sie erwartet.

    In einer PHP-Mailing Liste habe ich eine Diskussion gefunden, in der eval() zum instanzieren der Klasse benutzt wurde.

    Kennt vielleicht jemand eine Möglichkeit dies zu lösen?
    Wäre die Anwendung von eval() in diesem Bezug ebenfalls evil() oder handelt es sich gerade hierbei um eine mögliche Anwendung für die eval() gemacht wurde?

    Vorab: Nein, ich möchte die zu instanzierenden Klassen nicht umschreiben, damit sie selbst den array der die parameter enthält entgegennehmen. Dies widerspräche dem Sinn objekt-orientierter Entwicklung.

  • #2
    Hallo,

    ich denke da wird es nur die eval Lösung geben.

    Schlimm finde ich die Anwendung mit eval in diesen Zusammenhang nicht da der geparste Code ausschließlich vordefinierte Variablen enthält.

    Per call_user_func_array(array($classname, $classname), $args_ary); kann man zwar die Klasse initialisieren, aber wie bereits von dir bemerkt, nicht auf dessen Object zugreifen.

    PHP-Code:
    class Test {
        function 
    Test($classname) {
            
    $eval_str 'new ' $classname '(';
            
            
    $num func_num_args();
            if(
    $num 1) {
                
    $args func_get_args();
                for(
    $i=1;$i<$num;$i++) {
                    if(
    $i 1) {
                        
    $eval_str .= ',';
                    }
                    
    $eval_str .= '$args[' $i ']';
                }
            }
            
            
    $eval_str .= ');';
            
            eval(
    '$obj = ' $eval_str);
        }

    Zuletzt geändert von Sebastian W; 16.06.2005, 15:07.
    Grüsse,
    Sebastian


    Profil Flex Freelancer
    Twitter twitter.com/flashhilfe
    Web Flash und Flex Community

    Kommentar

    Lädt...
    X