Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung
71 Unwetterwarnungen in Deutschland
Die Datenbank wurde zuletzt am 02.08.2020 17:34:28 aktualiesiert
71

Reflection – Teil 2: ReflectionMethod und ReflectionFunction

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: