4 Stimmen

ReflectionClass in "normale" Klasse konvertieren

Ich habe eine Klasse TableData mit zwei magischen Methoden. Eine ist der Konstruktor und die andere ist die __call Methode.

Ich habe den Aufruf mit folgendem Code realisiert:

$class = new ReflectionClass('TableData');
$class->newInstanceArgs($parArray);

Es funktioniert großartig. Aber jetzt möchte ich meine magische Methode verwenden. Also rufe ich $class->getData() auf, aber es funktioniert nicht. Ich erhalte den Fehler, dass ich eine undefinierte Methode aufgerufen habe.
Ich habe versucht, ReflectionMethod und invoke zu verwenden, aber es funktioniert wieder nicht.

Gibt es keine Möglichkeit, das ReflectionClass Objekt in meine TableData Klasse zu überführen?

Danke für die Beratung!

11voto

Stefan Gehrig Punkte 80686

Sie können die Methode nicht auf der Instanz von ReflectionClass aufrufen. Sie müssen die Methode auf der Instanz Ihrer (reflektierten) Originalklasse aufrufen.

$class    = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);
$instance->getData();

2voto

Pascal MARTIN Punkte 384469

Was ist mit dem ersten Schritt mit der ReflectionClass :

class MyClass {
  public function __call($method, $args) {
    var_dump($method);
  }
}

$reflectionClass = new ReflectionClass('MyClass');

Und dann die Klasse instanziieren :

$class = $reflectionClass->newInstanceArgs();

Um Ihre Methode auf dem $class Objekt aufzurufen :

$class->getData();

Und Sie werden das erwartete Ergebnis erhalten :

string 'getData' (length=7)

d.h. Sie müssen Ihre Methoden auf dem aufrufen, was von newInstanceArgs zurückgegeben wird, und nicht auf der ReflectionClass selbst.

0voto

NikiC Punkte 98746

Ich frage mich, warum du hier überhaupt Reflection benutzt. Vielleicht möchtest du lieber deinen Konstruktor ändern, um ein Array zu akzeptieren?

Gründe, warum man Reflection nicht verwenden sollte, sind Langsamkeit und Unleserlichkeit: Das ist viel einfacher zu verwenden und zu verstehen:

$instace = new TableData($parArray);

Als dies:

$class    = new ReflectionClass('TableData');
$instance = $class->newInstanceArgs($parArray);

Also, wenn du möchtest, dass dein Konstruktor sowohl ein Array als Argument als auch eine Liste von Argumenten behandelt, kannst du func_get_args verwenden:

class TableData {
    public function __constructor() {
        if (func_num_args() != 1 || !is_array($params = func_get_arg(0))) {
            $params = func_get_args();
        }

        // jetzt sind die Argumente in $params auf jeden Fall
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X