📄 language.oop5.reflection.html
字号:
</p> <div class="example"> <p><b>Example #4 Using the <b class="classname">ReflectionClass</b> class</b></p> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">interface </span><span style="color: #0000BB">Serializable<br /></span><span style="color: #007700">{<br /> </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br />class </span><span style="color: #0000BB">Object<br /></span><span style="color: #007700">{<br /> </span><span style="color: #FF8000">// ...<br /></span><span style="color: #007700">}<br /><br /></span><span style="color: #FF8000">/**<br /> * A counter class<br /> */<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Counter </span><span style="color: #007700">extends </span><span style="color: #0000BB">Object </span><span style="color: #007700">implements </span><span style="color: #0000BB">Serializable <br /></span><span style="color: #007700">{<br /> const </span><span style="color: #0000BB">START </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /> private static </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">Counter</span><span style="color: #007700">::</span><span style="color: #0000BB">START</span><span style="color: #007700">;<br /><br /> </span><span style="color: #FF8000">/**<br /> * Invoke counter<br /> *<br /> * @access public<br /> * @return int<br /> */<br /> </span><span style="color: #007700">public function </span><span style="color: #0000BB">count</span><span style="color: #007700">() {<br /> return </span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$c</span><span style="color: #007700">++;<br /> }<br />}<br /><br /></span><span style="color: #FF8000">// Create an instance of the ReflectionClass class<br /></span><span style="color: #0000BB">$class </span><span style="color: #007700">= new </span><span style="color: #0000BB">ReflectionClass</span><span style="color: #007700">(</span><span style="color: #DD0000">'Counter'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Print out basic information<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(<br /> </span><span style="color: #DD0000">"===> The %s%s%s %s '%s' [extends %s]\n" </span><span style="color: #007700">.<br /> </span><span style="color: #DD0000">" declared in %s\n" </span><span style="color: #007700">.<br /> </span><span style="color: #DD0000">" lines %d to %d\n" </span><span style="color: #007700">.<br /> </span><span style="color: #DD0000">" having the modifiers %d [%s]\n"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">isInternal</span><span style="color: #007700">() ? </span><span style="color: #DD0000">'internal' </span><span style="color: #007700">: </span><span style="color: #DD0000">'user-defined'</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">isAbstract</span><span style="color: #007700">() ? </span><span style="color: #DD0000">' abstract' </span><span style="color: #007700">: </span><span style="color: #DD0000">''</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">isFinal</span><span style="color: #007700">() ? </span><span style="color: #DD0000">' final' </span><span style="color: #007700">: </span><span style="color: #DD0000">''</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">isInterface</span><span style="color: #007700">() ? </span><span style="color: #DD0000">'interface' </span><span style="color: #007700">: </span><span style="color: #DD0000">'class'</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getName</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">var_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getParentClass</span><span style="color: #007700">(), </span><span style="color: #0000BB">1</span><span style="color: #007700">),<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getFileName</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getStartLine</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getEndline</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getModifiers</span><span style="color: #007700">(),<br /> </span><span style="color: #0000BB">implode</span><span style="color: #007700">(</span><span style="color: #DD0000">' '</span><span style="color: #007700">, </span><span style="color: #0000BB">Reflection</span><span style="color: #007700">::</span><span style="color: #0000BB">getModifierNames</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getModifiers</span><span style="color: #007700">()))<br />);<br /><br /></span><span style="color: #FF8000">// Print documentation comment<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"---> Documentation:\n %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">var_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getDocComment</span><span style="color: #007700">(), </span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Print which interfaces are implemented by this class<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"---> Implements:\n %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">var_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getInterfaces</span><span style="color: #007700">(), </span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Print class constants<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"---> Constants: %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">var_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getConstants</span><span style="color: #007700">(), </span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Print class properties<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"---> Properties: %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">var_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getProperties</span><span style="color: #007700">(), </span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// Print class methods<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(</span><span style="color: #DD0000">"---> Methods: %s\n"</span><span style="color: #007700">, </span><span style="color: #0000BB">var_export</span><span style="color: #007700">(</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">getMethods</span><span style="color: #007700">(), </span><span style="color: #0000BB">1</span><span style="color: #007700">));<br /><br /></span><span style="color: #FF8000">// If this class is instantiable, create an instance<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">isInstantiable</span><span style="color: #007700">()) {<br /> </span><span style="color: #0000BB">$counter </span><span style="color: #007700">= </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">newInstance</span><span style="color: #007700">();<br /><br /> echo </span><span style="color: #DD0000">'---> $counter is instance? '</span><span style="color: #007700">; <br /> echo </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">isInstance</span><span style="color: #007700">(</span><span style="color: #0000BB">$counter</span><span style="color: #007700">) ? </span><span style="color: #DD0000">'yes' </span><span style="color: #007700">: </span><span style="color: #DD0000">'no'</span><span style="color: #007700">;<br /><br /> echo </span><span style="color: #DD0000">"\n---> new Object() is instance? "</span><span style="color: #007700">;<br /> echo </span><span style="color: #0000BB">$class</span><span style="color: #007700">-></span><span style="color: #0000BB">isInstance</span><span style="color: #007700">(new </span><span style="color: #0000BB">Object</span><span style="color: #007700">()) ? </span><span style="color: #DD0000">'yes' </span><span style="color: #007700">: </span><span style="color: #DD0000">'no'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> <blockquote><p><b class="note">Note</b>: <span class="simpara"> The method <b>newInstance()</b> accepts a variable number of arguments which are passed to the function just as in <a href="function.call-user-func.html" class="function">call_user_func()</a>. </span> </p></blockquote> <blockquote><p><b class="note">Note</b>: <span class="simpara"> <i>$class = new ReflectionClass('Foo'); $class->isInstance($arg)</i> is equivalent to <i>$arg instanceof Foo</i> or <i>is_a($arg, 'Foo')</i>. </span> </p></blockquote> </div> <div id="language.oop5.reflection.reflectionobject" class="sect2"> <h3 class="title"><b class="classname">ReflectionObject</b></h3> <p class="para"> The <b class="classname">ReflectionObject</b> class lets you reverse-engineer objects. </p> <div class="informalexample"> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ReflectionObject </span><span style="color: #007700">extends </span><span style="color: #0000BB">ReflectionClass<br /></span><span style="color: #007700">{<br /> final private </span><span style="color: #0000BB">__clone</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">void __construct</span><span style="color: #007700">(</span><span style="color: #0000BB">mixed object</span><span style="color: #007700">)<br /> public </span><span style="color: #0000BB">string __toString</span><span style="color: #007700">()<br /> public static </span><span style="color: #0000BB">string export</span><span style="color: #007700">(</span><span style="color: #0000BB">mixed object</span><span style="color: #007700">, </span><span style="color: #0000BB">bool </span><span style="color: #007700">return)<br />}<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> </div> <div id="language.oop5.reflection.reflectionmethod" class="sect2"> <h3 class="title"><b class="classname">ReflectionMethod</b></h3> <p class="para"> The <b class="classname">ReflectionMethod</b> class lets you reverse-engineer class methods. </p> <div class="informalexample"> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">ReflectionMethod </span><span style="color: #007700">extends </span><span style="color: #0000BB">ReflectionFunctionAbstract </span><span style="color: #007700">implements </span><span style="color: #0000BB">Reflector<br /></span><span style="color: #007700">{<br /> public </span><span style="color: #0000BB">void __construct</span><span style="color: #007700">(</span><span style="color: #0000BB">mixed </span><span style="color: #007700">class, </span><span style="color: #0000BB">string name</span><span style="color: #007700">)<br /> public </span><span style="color: #0000BB">string __toString</span><span style="color: #007700">()<br /> public static </span><span style="color: #0000BB">string export</span><span style="color: #007700">(</span><span style="color: #0000BB">mixed </span><span style="color: #007700">class, </span><span style="color: #0000BB">string name</span><span style="color: #007700">, </span><span style="color: #0000BB">bool </span><span style="color: #007700">return)<br /> public </span><span style="color: #0000BB">mixed invoke</span><span style="color: #007700">(</span><span style="color: #0000BB">stdclass object </span><span style="color: #007700">[, </span><span style="color: #0000BB">mixed args </span><span style="color: #007700">[, ...]])<br /> public </span><span style="color: #0000BB">mixed invokeArgs</span><span style="color: #007700">(</span><span style="color: #0000BB">stdclass object</span><span style="color: #007700">, array </span><span style="color: #0000BB">args</span><span style="color: #007700">)<br /> public </span><span style="color: #0000BB">bool isFinal</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isAbstract</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isPublic</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isPrivate</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isProtected</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isStatic</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isConstructor</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isDestructor</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">int getModifiers</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">mixed getClosure</span><span style="color: #007700">() </span><span style="color: #FF8000">/* As of PHP 5.3.0 */<br /> </span><span style="color: #007700">public </span><span style="color: #0000BB">ReflectionClass getDeclaringClass</span><span style="color: #007700">()<br /><br /> </span><span style="color: #FF8000">// Inherited from ReflectionFunctionAbstract<br /> </span><span style="color: #007700">final private </span><span style="color: #0000BB">__clone</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">string getName</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isInternal</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool isUserDefined</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">string getFileName</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">int getStartLine</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">int getEndLine</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">string getDocComment</span><span style="color: #007700">()<br /> public array </span><span style="color: #0000BB">getStaticVariables</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">bool returnsReference</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">ReflectionParameter</span><span style="color: #007700">[] </span><span style="color: #0000BB">getParameters</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">int getNumberOfParameters</span><span style="color: #007700">()<br /> public </span><span style="color: #0000BB">int getNumberOfRequiredParameters</span><span style="color: #007700">()<br />}<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> <p class="para"> To introspect a method, you will first have to create an instance of the <b class="classname">ReflectionMethod</b> class. You can then call any of the above methods on this instance. </p> <div class="example"> <p><b>Example #5 Using the <b class="classname">ReflectionMethod</b> class</b></p> <div class="example-contents"><div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #007700">class </span><span style="color: #0000BB">Counter<br /></span><span style="color: #007700">{<br /> private static </span><span style="color: #0000BB">$c </span><span style="color: #007700">= </span><span style="color: #0000BB">0</span><span style="color: #007700">;<br /><br /> </span><span style="color: #FF8000">/**<br /> * Increment counter<br /> *<br /> * @final<br /> * @static<br /> * @access public<br /> * @return int<br /> */<br /> </span><span style="color: #007700">final public static function </span><span style="color: #0000BB">increment</span><span style="color: #007700">()<br /> {<br /> return ++</span><span style="color: #0000BB">self</span><span style="color: #007700">::</span><span style="color: #0000BB">$c</span><span style="color: #007700">;<br /> }<br />}<br /><br /></span><span style="color: #FF8000">// Create an instance of the ReflectionMethod class<br /></span><span style="color: #0000BB">$method </span><span style="color: #007700">= new </span><span style="color: #0000BB">ReflectionMethod</span><span style="color: #007700">(</span><span style="color: #DD0000">'Counter'</span><span style="color: #007700">, </span><span style="color: #DD0000">'increment'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Print out basic information<br /></span><span style="color: #0000BB">printf</span><span style="color: #007700">(<br /> </span><span style="color: #DD0000">"===> The %s%s%s%s%s%s%s method '%s' (which is %s)\n" </span><span style="color: #007700">.<br /> </span><span style="color: #DD0000">" declared in %s\n" </span><span style="color: #007700">.<br /> </span><span style="color: #DD0000">" lines %d to %d\n" </span><span style="color: #007700">.<br /> </span><span style="color: #DD0000">" having the modifiers %d[%s]\n"</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$method</span><span style="color: #007700">-></span><span style="color: #0000BB">isInternal</span><span style="color: #007700">() ? </span><span style="color: #DD0000">'internal' </span><span style="color: #007700">: </span><span style="color: #DD0000">'user-defined'</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$method</span><span style="color: #007700">-></span><span style="color: #0000BB">isAbstract</span><span style="color: #007700">() ? </span><span style="color: #DD0000">' abstract' </span><span style="color: #007700">: </span><span style="color: #DD0000">''</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$method</span><span style="color: #007700">-></span><span style="color: #0000BB">isFinal</span><span style="color: #007700">() ? </span><span style="color: #DD0000">' final' </span><span style="color: #007700">: </span><span style="color: #DD0000">''</span><span style="color: #007700">,<br /> </span><span style="color: #0000BB">$method</span><span style="color: #007700">-></span><span style="color: #0000BB">isPublic</span><span style="color: #007700">() ? </span><span style="color: #DD0000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -