Hier nun also der zweite Teil, nachdem im letzten die ReflectionClass behandelt wurde. Doch nicht nur Klassen und Objekte kann man reflektieren, sondern auch Methoden und Funktionen . Das soll nun hier das Thema sein.
Beispielcode
Wie im letzten Beispiel muss folgender Code für alle weiteren Zwecke herhalten:
class Calculator { /** * This method adds the first two parameters or multiplies * them depending on the value of the third param */ public function AddOrMultiply($a, $b, $c = true) { static $someUselessVar = "123"; return $c ? $a+$b : $a*$b; } private function IamPrivate() {} }
Generelle Informationen
Um erstmal an ein ReflectionMethod – Objekt zu kommen, um dieses dann abfragen zu können müssen wir den Weg über das ReflectionClass – Objekt der beinhaltenden Klasse gehen.
$refclass = new ReflectionClass("Calculator"); $refmethod = $refclass->getMethod("AddOrMultiply"); print "Method ".$refmethod->getName()." is defined from line ".$refmethod->getStartLine()." to ".$refmethod->getEndLine()." in file ".$refmethod->getFileName(); //Method AddOrMultiply is defined from line 11 to 15 in file D:\xampp\htdocs\ref2.php
Doc-Block Kommentar
$refclass = new ReflectionClass("Calculator"); $refmethod = $refclass->getMethod("AddOrMultiply"); print $refmethod->getDocComment(); /** * This method adds the first two parameters or multiplies * them depending on the value of the third param */
Parameter-Anzahl
$refclass = new ReflectionClass("Calculator"); $refmethod = $refclass->getMethod("AddOrMultiply"); print $refmethod->getNumberOfParameters()." parameters of which ".$refmethod->getNumberOfRequiredParameters()." are required"; //3 parameters of which 2 are required
Parameter
Alle Parameter der Methode. Als Value wird ein ReflectionParameter – Objekt übergeben, welches dann in Teil 3 genauer unter die Lupe genommen wird.
$refclass = new ReflectionClass("Calculator"); $refmethod = $refclass->getMethod("AddOrMultiply"); print_r($refmethod->getParameters()); /* Array ( [0] => ReflectionParameter Object ( [name] => a ) [1] => ReflectionParameter Object ( [name] => b ) [2] => ReflectionParameter Object ( [name] => c ) ) */
Statische Variablen
$refclass = new ReflectionClass("Calculator"); $refmethod = $refclass->getMethod("AddOrMultiply"); print_r($refmethod->getStaticVariables()); /* Array ( [someUselessVar] => 123 ) */
Methode ausführen
$refclass = new ReflectionClass("Calculator"); $refmethod = $refclass->getMethod("AddOrMultiply"); print $refmethod->invoke(new Calculator,3,4); //7
Wird anstelle des Objekts der Klasse (new Calculator) null übergeben, so können auch statische Funktionen auf diese Art und Weise aufgerufen werden. „invoke“ geht übrigens nur bei protected und public Methoden. Würde man versuchen, die Methode IamPrivate auf diese Art zu invoken, wäre die Antwort eine ReflectionException mit Text Trying to invoke private method Calculator::IamPrivate().
Modifier abfragen
Den Typ der Methode kann man natürlich auch erfragen, was zurückkommt ist immer ein boolescher Wert. Weitere Funktionen dieser Art sind: isAbstract, isConstructor, isDestructor, isFinal, isPrivate, isProtected, isPublic, isStatic
$refclass = new ReflectionClass("Calculator"); $refmethod = $refclass->getMethod("AddOrMultiply"); var_dump($refmethod->isProtected()); //bool(false)
Funktionen reflektieren
Prinzipiell ist alles oben geschriebene auch für normale Funktionen gültig (jetzt mal abgesehen von der Sache mit den Modifiern: Dass eine schlichte Funktion nicht public/protected/private… sein kann sollte wohl klar sein). Beim reflektieren von Funktionen gibt es noch die 2 folgenden coolen Sachen:
Ist Funktion systemintern oder vom Benutzer definiert?
$reffunction = new ReflectionFunction("strpos"); var_dump($reffunction->isInternal()); //bool(true)
Ist Funktion deprecated?
$reffunction = new ReflectionFunction("ereg"); var_dump($reffunction->isDeprecated()); //bool(true)
To be continued
Wie immer ist meine Liste unvollständig, sollte aber das Wichtigste erschlagen haben. Für die ReflectionFunction und die ReflectionMethod gibts im Handbuch dann die Komplettauflistung. Der nächste Teil wird sich übrigens um die Parameter drehen.
Folgende Teile:
4 Antworten auf Reflection – Teil 2: ReflectionMethod und ReflectionFunction