{"id":263,"date":"2010-11-21T01:41:45","date_gmt":"2010-11-21T00:41:45","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=263"},"modified":"2010-11-26T23:29:16","modified_gmt":"2010-11-26T22:29:16","slug":"reflection-teil-2-reflectionmethod-und-reflectionfunction","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/reflection-teil-2-reflectionmethod-und-reflectionfunction\/","title":{"rendered":"Reflection \u2013 Teil 2: ReflectionMethod und ReflectionFunction"},"content":{"rendered":"<p>Hier nun also der zweite Teil, nachdem im letzten die <a href=\"https:\/\/d-mueller.de\/blog\/reflection-teil-1-reflectionclass\/\">ReflectionClass<\/a> behandelt wurde. Doch nicht nur Klassen und Objekte kann man reflektieren, sondern auch Methoden und Funktionen . Das soll nun hier das Thema sein.<\/p>\n<h3>Beispielcode<\/h3>\n<p>Wie im letzten Beispiel muss folgender Code f\u00fcr alle weiteren Zwecke herhalten:<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nclass Calculator\r\n{\r\n\t\/**\r\n\t * This method adds the first two parameters or multiplies\r\n\t * them depending on the value of the third param\r\n\t *\/\r\n\tpublic function AddOrMultiply($a, $b, $c = true)\r\n\t{\r\n\t\tstatic $someUselessVar = &quot;123&quot;;\r\n\t\treturn $c ? $a+$b : $a*$b;\r\n\t}\r\n\t\r\n\tprivate function IamPrivate()\r\n\t{}\r\n}\r\n<\/pre>\n<h3>Generelle Informationen<\/h3>\n<p>Um erstmal an ein ReflectionMethod &#8211; Objekt zu kommen, um dieses dann abfragen zu k\u00f6nnen m\u00fcssen wir den Weg \u00fcber das ReflectionClass &#8211; Objekt der beinhaltenden Klasse gehen.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$refclass = new ReflectionClass(&quot;Calculator&quot;);\r\n$refmethod = $refclass-&gt;getMethod(&quot;AddOrMultiply&quot;);\r\nprint &quot;Method &quot;.$refmethod-&gt;getName().&quot; is defined from line &quot;.$refmethod-&gt;getStartLine().&quot; to &quot;.$refmethod-&gt;getEndLine().&quot; in file &quot;.$refmethod-&gt;getFileName(); \r\n\/\/Method AddOrMultiply is defined from line 11 to 15 in file D:\\xampp\\htdocs\\ref2.php\r\n<\/pre>\n<h3>Doc-Block Kommentar<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$refclass = new ReflectionClass(&quot;Calculator&quot;);\r\n$refmethod = $refclass-&gt;getMethod(&quot;AddOrMultiply&quot;);\r\nprint $refmethod-&gt;getDocComment();\r\n\/**\r\n * This method adds the first two parameters or multiplies\r\n * them depending on the value of the third param\r\n *\/\r\n<\/pre>\n<h3>Parameter-Anzahl<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$refclass = new ReflectionClass(&quot;Calculator&quot;);\r\n$refmethod = $refclass-&gt;getMethod(&quot;AddOrMultiply&quot;);\r\nprint $refmethod-&gt;getNumberOfParameters().&quot; parameters of which &quot;.$refmethod-&gt;getNumberOfRequiredParameters().&quot; are required&quot;;\r\n\/\/3 parameters of which 2 are required\r\n<\/pre>\n<h3>Parameter<\/h3>\n<p>Alle Parameter der Methode. Als Value wird ein ReflectionParameter &#8211; Objekt \u00fcbergeben, welches dann in Teil 3 genauer unter die Lupe genommen wird.<\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$refclass = new ReflectionClass(&quot;Calculator&quot;);\r\n$refmethod = $refclass-&gt;getMethod(&quot;AddOrMultiply&quot;);\r\nprint_r($refmethod-&gt;getParameters());\r\n\/*\r\nArray\r\n(\r\n    [0] =&gt; ReflectionParameter Object\r\n        (\r\n            [name] =&gt; a\r\n        )\r\n    [1] =&gt; ReflectionParameter Object\r\n        (\r\n            [name] =&gt; b\r\n        )\r\n    [2] =&gt; ReflectionParameter Object\r\n        (\r\n            [name] =&gt; c\r\n        )\r\n)\r\n*\/\r\n<\/pre>\n<h3>Statische Variablen<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$refclass = new ReflectionClass(&quot;Calculator&quot;);\r\n$refmethod = $refclass-&gt;getMethod(&quot;AddOrMultiply&quot;);\r\nprint_r($refmethod-&gt;getStaticVariables());\r\n\/*\r\nArray\r\n(\r\n    [someUselessVar] =&gt; 123\r\n)\r\n*\/\r\n<\/pre>\n<h3>Methode ausf\u00fchren<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$refclass = new ReflectionClass(&quot;Calculator&quot;);\r\n$refmethod = $refclass-&gt;getMethod(&quot;AddOrMultiply&quot;);\r\nprint $refmethod-&gt;invoke(new Calculator,3,4);\r\n\/\/7\r\n<\/pre>\n<p>Wird anstelle des Objekts der Klasse (<i>new Calculator<\/i>) <i>null<\/i> \u00fcbergeben, so k\u00f6nnen auch statische Funktionen auf diese Art und Weise aufgerufen werden. &#8222;invoke&#8220; geht \u00fcbrigens nur bei protected und public Methoden. W\u00fcrde man versuchen, die Methode <i>IamPrivate<\/i> auf diese Art zu invoken, w\u00e4re die Antwort eine ReflectionException mit Text <i>Trying to invoke private method Calculator::IamPrivate()<\/i>.<\/p>\n<h3>Modifier abfragen<\/h3>\n<p>Den Typ der Methode kann man nat\u00fcrlich auch erfragen, was zur\u00fcckkommt ist immer ein boolescher Wert. Weitere Funktionen dieser Art sind: <i>isAbstract, isConstructor, isDestructor, isFinal, isPrivate, isProtected, isPublic, isStatic<\/i><\/p>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$refclass = new ReflectionClass(&quot;Calculator&quot;);\r\n$refmethod = $refclass-&gt;getMethod(&quot;AddOrMultiply&quot;);\r\nvar_dump($refmethod-&gt;isProtected());\r\n\/\/bool(false)\r\n<\/pre>\n<h3>Funktionen reflektieren<\/h3>\n<p>Prinzipiell ist alles oben geschriebene auch f\u00fcr normale Funktionen g\u00fcltig (jetzt mal abgesehen von der Sache mit den Modifiern: Dass eine schlichte Funktion nicht public\/protected\/private&#8230; sein kann sollte wohl klar sein). Beim reflektieren von Funktionen gibt es noch die 2 folgenden coolen Sachen:<\/p>\n<h3>Ist Funktion systemintern oder vom Benutzer definiert?<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$reffunction = new ReflectionFunction(&quot;strpos&quot;);\r\nvar_dump($reffunction-&gt;isInternal());\r\n\/\/bool(true)\r\n<\/pre>\n<h3>Ist Funktion deprecated?<\/h3>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\n$reffunction = new ReflectionFunction(&quot;ereg&quot;);\r\nvar_dump($reffunction-&gt;isDeprecated());\r\n\/\/bool(true)\r\n<\/pre>\n<h3>To be continued<\/h3>\n<p>Wie immer ist meine Liste unvollst\u00e4ndig, sollte aber das Wichtigste erschlagen haben. F\u00fcr die <a href=\"http:\/\/php.net\/manual\/en\/class.reflectionfunction.php\">ReflectionFunction<\/a> und die <a href=\"http:\/\/www.php.net\/manual\/en\/class.reflectionmethod.php\">ReflectionMethod<\/a> gibts im Handbuch dann die Komplettauflistung. Der n\u00e4chste Teil wird sich \u00fcbrigens um die Parameter drehen.<\/p>\n<p>\n<b>Folgende Teile:<\/b><\/p>\n<ul>\n<li><a href=\"https:\/\/d-mueller.de\/blog\/reflection-teil-3-reflectionparameter\/\">Teil 3: ReflectionParameter<\/a><\/li>\n<li><a href=\"https:\/\/d-mueller.de\/blog\/reflection-teil-4-reflectionproperty\/\">Teil 4: ReflectionProperty<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>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 &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/reflection-teil-2-reflectionmethod-und-reflectionfunction\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,3],"tags":[],"class_list":["post-263","post","type-post","status-publish","format-standard","hentry","category-php","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=263"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/263\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}