<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Reflexão</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="Manual do PHP" HREF="index.html"><LINK REL="UP" TITLE="Classes e Objetos (PHP 5)" HREF="language.oop5.html"><LINK REL="PREVIOUS" TITLE="Comparando objetos" HREF="language.oop5.object-comparison.html"><LINK REL="NEXT" TITLE="Indução de Tipo" HREF="language.oop5.typehinting.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="sect1" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >Manual do PHP</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="language.oop5.object-comparison.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >Capítulo 19. Classes e Objetos (PHP 5)</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="language.oop5.typehinting.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="language.oop5.reflection" >Reflexão</A ></H1 ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.introduction" >Introdução</A ></H2 ><P > PHP 5 vem com uma API completa de reflexão que acrescenta a habilidade de fazer engenharia-reversa em classes, interfaces, funções e métodos assim como extensões. Além disso, a API de reflexão também oferece maneiras de recuperar comentários de documentação para funções, classes e métodos. </P ><P > A API de reflexão é uma extensão orientada a objetos ao Engine Zend, consistindo das seguintes classes: </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN5985" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">Reflection </font><font color="#007700">{ }<br /></font><font color="#0000BB">interface Reflector </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionException </font><font color="#007700">extends </font><font color="#0000BB">Exception </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionFunction implements Reflector </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionParameter implements Reflector </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionMethod </font><font color="#007700">extends </font><font color="#0000BB">ReflectionFunction </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionClass implements Reflector </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionObject </font><font color="#007700">extends </font><font color="#0000BB">ReflectionClass </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionProperty implements Reflector </font><font color="#007700">{ }<br />class </font><font color="#0000BB">ReflectionExtension implements Reflector </font><font color="#007700">{ }<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Para detalhes sobre essas classes, procure nos próximos capítulos. </P ></BLOCKQUOTE ></DIV ><P > Se fossemos executar o código no exemplo abaixo: <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN5990" ></A ><P ><B >Exemplo 19-33. Uso básico da API de reflexão</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />Reflection</font><font color="#007700">::</font><font color="#0000BB">export</font><font color="#007700">(new </font><font color="#0000BB">ReflectionClass</font><font color="#007700">(</font><font color="#DD0000">'Exception'</font><font color="#007700">));<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P >O exemplo acima irá imprimir:</P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="screen" >Class [ <internal> class Exception ] { - Constants [0] { } - Static properties [0] { } - Static methods [0] { } - Properties [6] { Property [ <default> protected $message ] Property [ <default> private $string ] Property [ <default> protected $code ] Property [ <default> protected $file ] Property [ <default> protected $line ] Property [ <default> private $trace ] } - Methods [9] { Method [ <internal> final private method __clone ] { } Method [ <internal> <ctor> public method __construct ] { - Parameters [2] { Parameter #0 [ <required> $message ] Parameter #1 [ <required> $code ] } } Method [ <internal> final public method getMessage ] { } Method [ <internal> final public method getCode ] { } Method [ <internal> final public method getFile ] { } Method [ <internal> final public method getLine ] { } Method [ <internal> final public method getTrace ] { } Method [ <internal> final public method getTraceAsString ] { } Method [ <internal> public method __toString ] { } } }</PRE ></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionexception" ><B CLASS="classname" >ReflectionException</B ></A ></H2 ><P > <B CLASS="classname" >ReflectionException</B > herda da classe de exceção padrão <A HREF="language.exceptions.html" >Exception</A > e é disparada pela API de Reflecção. Nenhum método ou propriedade específicos são introduzidos. </P ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionfunction" ><B CLASS="classname" >ReflectionFunction</B ></A ></H2 ><P > A classe <B CLASS="classname" >ReflectionFunction</B > permite a engenharia-reversa de funções. </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN6006" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionFunction implements Reflector<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">final private __clone</font><font color="#007700">()<br /> </font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public string __toString</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">, </font><font color="#0000BB">bool </font><font color="#007700">return)<br /> </font><font color="#0000BB">public string getName</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isInternal</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isUserDefined</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getFileName</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getStartLine</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getEndLine</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getStaticVariables</font><font color="#007700">()<br /> </font><font color="#0000BB">public mixed invoke</font><font color="#007700">(</font><font color="#0000BB">mixed args</font><font color="#007700">)<br /> </font><font color="#0000BB">public mixed invokeArgs</font><font color="#007700">(array </font><font color="#0000BB">args</font><font color="#007700">)<br /> </font><font color="#0000BB">public bool returnsReference</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionParameter</font><font color="#007700">[] </font><font color="#0000BB">getParameters</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getNumberOfParameters</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getNumberOfRequiredParameters</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > <B CLASS="function" >getNumberOfParameters()</B > e <B CLASS="function" >getNumberOfRequiredParameters()</B > foram adicionados no PHP 5.0.3, e <B CLASS="function" >invokeArgs()</B > foi adicionado no PHP 5.1.0. </P ></BLOCKQUOTE ></DIV ><P > Para introspectar uma função, você primeiro terá que criar uma instância da classe <B CLASS="classname" >ReflectionFunction</B >. Você pode, então, chamar qualquer um dos métodos acima nessa instância. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6015" ></A ><P ><B >Exemplo 19-34. Usando a classe <B CLASS="classname" >ReflectionFunction</B ></B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">/**<br /> * Um contador simples<br /> *<br /> * @return int<br /> */<br /></font><font color="#007700">function </font><font color="#0000BB">counter</font><font color="#007700">()<br />{<br /> static </font><font color="#0000BB">$c </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /> return </font><font color="#0000BB">$c</font><font color="#007700">++;<br />}<br /><br /></font><font color="#FF8000">// Cria uma instância da classe ReflectionFunction<br /></font><font color="#0000BB">$func </font><font color="#007700">= new </font><font color="#0000BB">ReflectionFunction</font><font color="#007700">(</font><font color="#DD0000">'counter'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// Imprime informações básicas<br /></font><font color="#0000BB">printf</font><font color="#007700">(<br /> </font><font color="#DD0000">"===> The %s function '%s'\n"</font><font color="#007700">.<br /> </font><font color="#DD0000">" declared in %s\n"</font><font color="#007700">.<br /> </font><font color="#DD0000">" lines %d to %d\n"</font><font color="#007700">,<br /> </font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">isInternal</font><font color="#007700">() ? </font><font color="#DD0000">'internal' </font><font color="#007700">: </font><font color="#DD0000">'user-defined'</font><font color="#007700">,<br /> </font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">getName</font><font color="#007700">(),<br /> </font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">getFileName</font><font color="#007700">(),<br /> </font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">getStartLine</font><font color="#007700">(),<br /> </font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">getEndline</font><font color="#007700">()<br />);<br /><br /></font><font color="#FF8000">// Imprime comentários de documentação<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Documentation:\n %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">getDocComment</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Imprime variáveis estáticas se existirem<br /></font><font color="#007700">if (</font><font color="#0000BB">$statics </font><font color="#007700">= </font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">getStaticVariables</font><font color="#007700">())<br />{<br /> </font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Static variables: %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$statics</font><font color="#007700">, </font><font color="#0000BB">1</font><font color="#007700">));<br />}<br /><br /></font><font color="#FF8000">// Invoca a função<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Invokation results in: "</font><font color="#007700">);<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$func</font><font color="#007700">-></font><font color="#0000BB">invoke</font><font color="#007700">());<br /><br /><br /></font><font color="#FF8000">// Você pode preferir usar o método export()<br /></font><font color="#007700">echo </font><font color="#DD0000">"\nReflectionFunction::export() results:\n"</font><font color="#007700">;<br />echo </font><font color="#0000BB">ReflectionFunction</font><font color="#007700">::</font><font color="#0000BB">export</font><font color="#007700">(</font><font color="#DD0000">'counter'</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > O método <B CLASS="function" >invoke()</B > aceita um número variável de argumentos que serão passados para a função assim como em <A HREF="function.call-user-func.html" ><B CLASS="function" >call_user_func()</B ></A >. </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionparameter" ><B CLASS="classname" >ReflectionParameter</B ></A ></H2 ><P > A classe <B CLASS="classname" >ReflectionParameter</B > recupera informação sobre os parâmetros de uma função ou de um método. </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN6028" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionParameter implements Reflector<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">final private __clone</font><font color="#007700">()<br /> </font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public string __toString</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">(</font><font color="#0000BB">mixed </font><font color="#007700">class, </font><font color="#0000BB">bool </font><font color="#007700">return)<br /> </font><font color="#0000BB">public string getName</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isPassedByReference</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionClass getClass</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isArray</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool allowsNull</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isOptional</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isDefaultValueAvailable</font><font color="#007700">()<br /> </font><font color="#0000BB">public mixed getDefaultValue</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > <B CLASS="function" >getDefaultValue()</B >, <B CLASS="function" >isDefaultValueAvailable()</B >, <B CLASS="function" >isOptional()</B > foram adicionados no PHP 5.0.3, e <B CLASS="function" >isArray()</B > foi adicionado no PHP 5.1.0. </P ></BLOCKQUOTE ></DIV ><P > Para introspectar parâmetros, você terá que primeiro criar uma instância das classes <B CLASS="classname" >ReflectionFunction</B > ou <B CLASS="classname" >ReflectionMethod</B > e então usar o seu método <B CLASS="function" >getParameters()</B > para recuperar um array de parâmetros. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6040" ></A ><P ><B >Exemplo 19-35. Usando a classe <B CLASS="classname" >ReflectionParameter</B ></B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">function </font><font color="#0000BB">foo</font><font color="#007700">(</font><font color="#0000BB">$a</font><font color="#007700">, </font><font color="#0000BB">$b</font><font color="#007700">, </font><font color="#0000BB">$c</font><font color="#007700">) { }<br />function </font><font color="#0000BB">bar</font><font color="#007700">(</font><font color="#0000BB">Exception $a</font><font color="#007700">, &</font><font color="#0000BB">$b</font><font color="#007700">, </font><font color="#0000BB">$c</font><font color="#007700">) { }<br />function </font><font color="#0000BB">baz</font><font color="#007700">(</font><font color="#0000BB">ReflectionFunction $a</font><font color="#007700">, </font><font color="#0000BB">$b </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">, </font><font color="#0000BB">$c </font><font color="#007700">= </font><font color="#0000BB">null</font><font color="#007700">) { }<br />function </font><font color="#0000BB">abc</font><font color="#007700">() { }<br /><br /></font><font color="#FF8000">// Crie uma instância de ReflectionFunction com o<br />// parâmetro dado da linha de comando.<br /></font><font color="#0000BB">$reflect </font><font color="#007700">= new </font><font color="#0000BB">ReflectionFunction</font><font color="#007700">(</font><font color="#0000BB">$argv</font><font color="#007700">[</font><font color="#0000BB">1</font><font color="#007700">]);<br /><br />echo </font><font color="#0000BB">$reflect</font><font color="#007700">;<br /><br />foreach (</font><font color="#0000BB">$reflect</font><font color="#007700">-></font><font color="#0000BB">getParameters</font><font color="#007700">() as </font><font color="#0000BB">$i </font><font color="#007700">=> </font><font color="#0000BB">$param</font><font color="#007700">) {<br /> </font><font color="#0000BB">printf</font><font color="#007700">(<br /> </font><font color="#DD0000">"-- Parameter #%d: %s {\n"</font><font color="#007700">.<br /> </font><font color="#DD0000">" Class: %s\n"</font><font color="#007700">.<br /> </font><font color="#DD0000">" Allows NULL: %s\n"</font><font color="#007700">.<br /> </font><font color="#DD0000">" Passed to by reference: %s\n"</font><font color="#007700">.<br /> </font><font color="#DD0000">" Is optional?: %s\n"</font><font color="#007700">.<br /> </font><font color="#DD0000">"}\n"</font><font color="#007700">,<br /> </font><font color="#0000BB">$i</font><font color="#007700">,<br /> </font><font color="#0000BB">$param</font><font color="#007700">-></font><font color="#0000BB">getName</font><font color="#007700">(),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$param</font><font color="#007700">-></font><font color="#0000BB">getClass</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$param</font><font color="#007700">-></font><font color="#0000BB">allowsNull</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$param</font><font color="#007700">-></font><font color="#0000BB">isPassedByReference</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /> </font><font color="#0000BB">$param</font><font color="#007700">-></font><font color="#0000BB">isOptional</font><font color="#007700">() ? </font><font color="#DD0000">'yes' </font><font color="#007700">: </font><font color="#DD0000">'no'<br /> </font><font color="#007700">);<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionclass" ><B CLASS="classname" >ReflectionClass</B ></A ></H2 ><P > A classe <B CLASS="classname" >ReflectionClass</B > permite fazer a engenharia-reversa de uma classe. </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN6049" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionClass implements Reflector<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">final private __clone</font><font color="#007700">()<br /> </font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public string __toString</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getName</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isInternal</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isUserDefined</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isInstantiable</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool hasConstant</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public bool hasMethod</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public bool hasProperty</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public string getFileName</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getStartLine</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getEndLine</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionMethod getConstructor</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionMethod getMethod</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public ReflectionMethod</font><font color="#007700">[] </font><font color="#0000BB">getMethods</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionProperty getProperty</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public ReflectionProperty</font><font color="#007700">[] </font><font color="#0000BB">getProperties</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getConstants</font><font color="#007700">()<br /> </font><font color="#0000BB">public mixed getConstant</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public ReflectionClass</font><font color="#007700">[] </font><font color="#0000BB">getInterfaces</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isInterface</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isAbstract</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isFinal</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getModifiers</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isInstance</font><font color="#007700">(</font><font color="#0000BB">stdclass object</font><font color="#007700">)<br /> </font><font color="#0000BB">public stdclass newInstance</font><font color="#007700">(</font><font color="#0000BB">mixed args</font><font color="#007700">)<br /> </font><font color="#0000BB">public ReflectionClass getParentClass</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isSubclassOf</font><font color="#007700">(</font><font color="#0000BB">ReflectionClass </font><font color="#007700">class)<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getStaticProperties</font><font color="#007700">()<br /> </font><font color="#0000BB">public mixed getStaticPropertyValue</font><font color="#007700">(</font><font color="#0000BB">string name </font><font color="#007700">[, </font><font color="#0000BB">mixed </font><font color="#007700">default])<br /> </font><font color="#0000BB">public void setStaticPropertyValue</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">, </font><font color="#0000BB">mixed value</font><font color="#007700">)<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getDefaultProperties</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isIterateable</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool implementsInterface</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public ReflectionExtension getExtension</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getExtensionName</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > <B CLASS="function" >hasConstant()</B >, <B CLASS="function" >hasMethod()</B >, <B CLASS="function" >hasProperty()</B >, <B CLASS="function" >getStaticPropertyValue()</B > e <B CLASS="function" >setStaticPropertyValue()</B > foram adicionados no PHP 5.1.0. </P ></BLOCKQUOTE ></DIV ><P > To introspect a class, you will first have to create an instance of the <B CLASS="classname" >ReflectionClass</B > class. You can then call any of the above methods on this instance. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6060" ></A ><P ><B >Exemplo 19-36. Using the <B CLASS="classname" >ReflectionClass</B > class</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />interface Serializable<br /></font><font color="#007700">{<br /> </font><font color="#FF8000">// ...<br /></font><font color="#007700">}<br /><br />class </font><font color="#0000BB">Object<br /></font><font color="#007700">{<br /> </font><font color="#FF8000">// ...<br /></font><font color="#007700">}<br /><br /></font><font color="#FF8000">/**<br /> * Uma classe contadora<br /> */<br /></font><font color="#007700">class </font><font color="#0000BB">Counter </font><font color="#007700">extends </font><font color="#0000BB">Object implements Serializable<br /></font><font color="#007700">{<br /> const </font><font color="#0000BB">START </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /> </font><font color="#0000BB">private </font><font color="#007700">static </font><font color="#0000BB">$c </font><font color="#007700">= </font><font color="#0000BB">Counter</font><font color="#007700">::</font><font color="#0000BB">START</font><font color="#007700">;<br /><br /> </font><font color="#FF8000">/**<br /> * Contador de invocação<br /> *<br /> * @access public<br /> * @return int<br /> */<br /> </font><font color="#0000BB">public </font><font color="#007700">function </font><font color="#0000BB">count</font><font color="#007700">() {<br /> return </font><font color="#0000BB">self</font><font color="#007700">::</font><font color="#0000BB">$c</font><font color="#007700">++;<br /> }<br />}<br /><br /></font><font color="#FF8000">// Crie uma instância da classe ReflectionClass<br /></font><font color="#0000BB">$class </font><font color="#007700">= new </font><font color="#0000BB">ReflectionClass</font><font color="#007700">(</font><font color="#DD0000">'Counter'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// Imprime informação básica<br /></font><font color="#0000BB">printf</font><font color="#007700">(<br /> </font><font color="#DD0000">"===> The %s%s%s %s '%s' [extends %s]\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">" declared in %s\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">" lines %d to %d\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">" having the modifiers %d [%s]\n"</font><font color="#007700">,<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">isInternal</font><font color="#007700">() ? </font><font color="#DD0000">'internal' </font><font color="#007700">: </font><font color="#DD0000">'user-defined'</font><font color="#007700">,<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">isAbstract</font><font color="#007700">() ? </font><font color="#DD0000">' abstract' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">isFinal</font><font color="#007700">() ? </font><font color="#DD0000">' final' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">isInterface</font><font color="#007700">() ? </font><font color="#DD0000">'interface' </font><font color="#007700">: </font><font color="#DD0000">'class'</font><font color="#007700">,<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getName</font><font color="#007700">(),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getParentClass</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getFileName</font><font color="#007700">(),<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getStartLine</font><font color="#007700">(),<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getEndline</font><font color="#007700">(),<br /> </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getModifiers</font><font color="#007700">(),<br /> </font><font color="#0000BB">implode</font><font color="#007700">(</font><font color="#DD0000">' '</font><font color="#007700">, </font><font color="#0000BB">Reflection</font><font color="#007700">::</font><font color="#0000BB">getModifierNames</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getModifiers</font><font color="#007700">()))<br />);<br /><br /></font><font color="#FF8000">// Imprime comentários de documentação<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Documentation:\n %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getDocComment</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Imprime quais interfaces são implementadas por essa classe<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Implements:\n %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getInterfaces</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Imprime as constantes da classe<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Constants: %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getConstants</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Imprime as propriedades da classe<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Properties: %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getProperties</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Imprime os métodos da classe<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Methods: %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">getMethods</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Se essa classe for instanciável, cria uma instância<br /></font><font color="#007700">if (</font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">isInstantiable</font><font color="#007700">()) {<br /> </font><font color="#0000BB">$counter </font><font color="#007700">= </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">newInstance</font><font color="#007700">();<br /><br /> echo </font><font color="#DD0000">'---> $counter is instance? '</font><font color="#007700">;<br /> echo </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">isInstance</font><font color="#007700">(</font><font color="#0000BB">$counter</font><font color="#007700">) ? </font><font color="#DD0000">'yes' </font><font color="#007700">: </font><font color="#DD0000">'no'</font><font color="#007700">;<br /><br /> echo </font><font color="#DD0000">"\n---> new Object() is instance? "</font><font color="#007700">;<br /> echo </font><font color="#0000BB">$class</font><font color="#007700">-></font><font color="#0000BB">isInstance</font><font color="#007700">(new </font><font color="#0000BB">Object</font><font color="#007700">()) ? </font><font color="#DD0000">'yes' </font><font color="#007700">: </font><font color="#DD0000">'no'</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > O método <B CLASS="function" >newInstance()</B > aceita um número variável de argumentos que são passados para a função assim como em <A HREF="function.call-user-func.html" ><B CLASS="function" >call_user_func()</B ></A >. </P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > <TT CLASS="literal" >$class = new ReflectionClass('Foo'); $class->isInstance($arg)</TT > é equivalente a<TT CLASS="literal" >$arg instanceof Foo</TT > ou <TT CLASS="literal" >is_a($arg, 'Foo')</TT >. </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionobject" ><B CLASS="classname" >ReflectionObject</B ></A ></H2 ><P > A classe <B CLASS="classname" >ReflectionObject</B > permite que você faça engenharia reversa de objetos. </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN6078" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionObject </font><font color="#007700">extends </font><font color="#0000BB">ReflectionClass<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">final private __clone</font><font color="#007700">()<br /> </font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">mixed object</font><font color="#007700">)<br /> </font><font color="#0000BB">public string __toString</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">(</font><font color="#0000BB">mixed object</font><font color="#007700">, </font><font color="#0000BB">bool </font><font color="#007700">return)<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionmethod" ><B CLASS="classname" >ReflectionMethod</B ></A ></H2 ><P > A classe <B CLASS="classname" >ReflectionMethod</B > permite fazer a engenharia-reversa de métodos de classes. </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN6085" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionMethod </font><font color="#007700">extends </font><font color="#0000BB">ReflectionFunction<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">public __construct</font><font color="#007700">(</font><font color="#0000BB">mixed </font><font color="#007700">class, </font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public string __toString</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">(</font><font color="#0000BB">mixed </font><font color="#007700">class, </font><font color="#0000BB">string name</font><font color="#007700">, </font><font color="#0000BB">bool </font><font color="#007700">return)<br /> </font><font color="#0000BB">public mixed invoke</font><font color="#007700">(</font><font color="#0000BB">stdclass object</font><font color="#007700">, </font><font color="#0000BB">mixed args</font><font color="#007700">)<br /> </font><font color="#0000BB">public moxed invokeArgs</font><font color="#007700">(</font><font color="#0000BB">stdclass object</font><font color="#007700">, array </font><font color="#0000BB">args</font><font color="#007700">)<br /> </font><font color="#0000BB">public bool isFinal</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isAbstract</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isPublic</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isPrivate</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isProtected</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isStatic</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isConstructor</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isDestructor</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getModifiers</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionClass getDeclaringClass</font><font color="#007700">()<br /><br /> </font><font color="#FF8000">// Herdado de ReflectionFunction<br /> </font><font color="#0000BB">final private __clone</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getName</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isInternal</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isUserDefined</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getFileName</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getStartLine</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getEndLine</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getStaticVariables</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool returnsReference</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionParameter</font><font color="#007700">[] </font><font color="#0000BB">getParameters</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getNumberOfParameters</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getNumberOfRequiredParameters</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><P > Para introspectar um método, você tem que primeiro criar uma instância da classe <B CLASS="classname" >ReflectionMethod</B >. Você pode, então, chamar qualquer um dos métodos acima nessa instância. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6089" ></A ><P ><B >Exemplo 19-37. Usando a classe <B CLASS="classname" >ReflectionMethod</B ></B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">Counter<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">private </font><font color="#007700">static </font><font color="#0000BB">$c </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /><br /> </font><font color="#FF8000">/**<br /> * Incrementa o contador<br /> *<br /> * @final<br /> * @static<br /> * @access public<br /> * @return int<br /> */<br /> </font><font color="#0000BB">final public </font><font color="#007700">static function </font><font color="#0000BB">increment</font><font color="#007700">()<br /> {<br /> return ++</font><font color="#0000BB">self</font><font color="#007700">::</font><font color="#0000BB">$c</font><font color="#007700">;<br /> }<br />}<br /><br /></font><font color="#FF8000">// Cria uma instância da classe ReflectionMethod<br /></font><font color="#0000BB">$method </font><font color="#007700">= new </font><font color="#0000BB">ReflectionMethod</font><font color="#007700">(</font><font color="#DD0000">'Counter'</font><font color="#007700">, </font><font color="#DD0000">'increment'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// Imprime informação básica<br /></font><font color="#0000BB">printf</font><font color="#007700">(<br /> </font><font color="#DD0000">"===> The %s%s%s%s%s%s%s method '%s' (which is %s)\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">" declared in %s\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">" lines %d to %d\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">" having the modifiers %d[%s]\n"</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isInternal</font><font color="#007700">() ? </font><font color="#DD0000">'internal' </font><font color="#007700">: </font><font color="#DD0000">'user-defined'</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isAbstract</font><font color="#007700">() ? </font><font color="#DD0000">' abstract' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isFinal</font><font color="#007700">() ? </font><font color="#DD0000">' final' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isPublic</font><font color="#007700">() ? </font><font color="#DD0000">' public' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isPrivate</font><font color="#007700">() ? </font><font color="#DD0000">' private' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isProtected</font><font color="#007700">() ? </font><font color="#DD0000">' protected' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isStatic</font><font color="#007700">() ? </font><font color="#DD0000">' static' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getName</font><font color="#007700">(),<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">isConstructor</font><font color="#007700">() ? </font><font color="#DD0000">'the constructor' </font><font color="#007700">: </font><font color="#DD0000">'a regular method'</font><font color="#007700">,<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getFileName</font><font color="#007700">(),<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getStartLine</font><font color="#007700">(),<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getEndline</font><font color="#007700">(),<br /> </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getModifiers</font><font color="#007700">(),<br /> </font><font color="#0000BB">implode</font><font color="#007700">(</font><font color="#DD0000">' '</font><font color="#007700">, </font><font color="#0000BB">Reflection</font><font color="#007700">::</font><font color="#0000BB">getModifierNames</font><font color="#007700">(</font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getModifiers</font><font color="#007700">()))<br />);<br /><br /></font><font color="#FF8000">// Imprime comentários de documentação<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Documentation:\n %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getDocComment</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Imprime variáveis estáticas se existirem<br /></font><font color="#007700">if (</font><font color="#0000BB">$statics</font><font color="#007700">= </font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">getStaticVariables</font><font color="#007700">()) {<br /> </font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Static variables: %s\n"</font><font color="#007700">, </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$statics</font><font color="#007700">, </font><font color="#0000BB">1</font><font color="#007700">));<br />}<br /><br /></font><font color="#FF8000">// Invoke the method<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Invokation results in: "</font><font color="#007700">);<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$method</font><font color="#007700">-></font><font color="#0000BB">invoke</font><font color="#007700">(</font><font color="#0000BB">NULL</font><font color="#007700">));<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Tentar invocar métodos privados, protegidos ou abstratos resultarão numa exceção sendo disparada do método <B CLASS="function" >invoke()</B > </P ></BLOCKQUOTE ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Para métodos estáticos como visto acima, você deve passar NULL como o primeiro argumento para <B CLASS="function" >invoke()</B >. Para métodos não-estáticos, passe uma instância da classe. </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionproperty" ><B CLASS="classname" >ReflectionProperty</B ></A ></H2 ><P > A classe <B CLASS="classname" >ReflectionProperty</B > permite fazer engenharia-reversa das propriedades da classe. </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN6104" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionProperty implements Reflector<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">final private __clone</font><font color="#007700">()<br /> </font><font color="#0000BB">public __construct</font><font color="#007700">(</font><font color="#0000BB">mixed </font><font color="#007700">class, </font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public string __toString</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">(</font><font color="#0000BB">mixed </font><font color="#007700">class, </font><font color="#0000BB">string name</font><font color="#007700">, </font><font color="#0000BB">bool </font><font color="#007700">return)<br /> </font><font color="#0000BB">public string getName</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isPublic</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isPrivate</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isProtected</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isStatic</font><font color="#007700">()<br /> </font><font color="#0000BB">public bool isDefault</font><font color="#007700">()<br /> </font><font color="#0000BB">public int getModifiers</font><font color="#007700">()<br /> </font><font color="#0000BB">public mixed getValue</font><font color="#007700">(</font><font color="#0000BB">stdclass object</font><font color="#007700">)<br /> </font><font color="#0000BB">public void setValue</font><font color="#007700">(</font><font color="#0000BB">stdclass object</font><font color="#007700">, </font><font color="#0000BB">mixed value</font><font color="#007700">)<br /> </font><font color="#0000BB">public ReflectionClass getDeclaringClass</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > <B CLASS="function" >getDocComment()</B > foi adicionado no PHP 5.1.0. </P ></BLOCKQUOTE ></DIV ><P > Para introspectar um método, você tem que primeiro criar uma instância da classe <B CLASS="classname" >ReflectionProperty</B >. Você pode, então, chamar qualquer um dos métodos acima nessa instância. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6111" ></A ><P ><B >Exemplo 19-38. Usando a classe <B CLASS="classname" >ReflectionProperty</B ></B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">String<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">public $length </font><font color="#007700">= </font><font color="#0000BB">5</font><font color="#007700">;<br />}<br /><br /></font><font color="#FF8000">// Cria uma instância da classe ReflectionProperty<br /></font><font color="#0000BB">$prop </font><font color="#007700">= new </font><font color="#0000BB">ReflectionProperty</font><font color="#007700">(</font><font color="#DD0000">'String'</font><font color="#007700">, </font><font color="#DD0000">'length'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// Imprime informação básica<br /></font><font color="#0000BB">printf</font><font color="#007700">(<br /> </font><font color="#DD0000">"===> The%s%s%s%s property '%s' (which was %s)\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">" having the modifiers %s\n"</font><font color="#007700">,<br /> </font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">isPublic</font><font color="#007700">() ? </font><font color="#DD0000">' public' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">isPrivate</font><font color="#007700">() ? </font><font color="#DD0000">' private' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">isProtected</font><font color="#007700">() ? </font><font color="#DD0000">' protected' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">isStatic</font><font color="#007700">() ? </font><font color="#DD0000">' static' </font><font color="#007700">: </font><font color="#DD0000">''</font><font color="#007700">,<br /> </font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">getName</font><font color="#007700">(),<br /> </font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">isDefault</font><font color="#007700">() ? </font><font color="#DD0000">'declared at compile-time' </font><font color="#007700">: </font><font color="#DD0000">'created at run-time'</font><font color="#007700">,<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">Reflection</font><font color="#007700">::</font><font color="#0000BB">getModifierNames</font><font color="#007700">(</font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">getModifiers</font><font color="#007700">()), </font><font color="#0000BB">1</font><font color="#007700">)<br />);<br /><br /></font><font color="#FF8000">// Cria uma instância de String<br /></font><font color="#0000BB">$obj</font><font color="#007700">= new </font><font color="#0000BB">String</font><font color="#007700">();<br /><br /></font><font color="#FF8000">// Pega o valor atual<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Value is: "</font><font color="#007700">);<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">getValue</font><font color="#007700">(</font><font color="#0000BB">$obj</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Muda o valor<br /></font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">setValue</font><font color="#007700">(</font><font color="#0000BB">$obj</font><font color="#007700">, </font><font color="#0000BB">10</font><font color="#007700">);<br /></font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---> Setting value to 10, new value is: "</font><font color="#007700">);<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$prop</font><font color="#007700">-></font><font color="#0000BB">getValue</font><font color="#007700">(</font><font color="#0000BB">$obj</font><font color="#007700">));<br /><br /></font><font color="#FF8000">// Destrói o objeto<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$obj</font><font color="#007700">);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Tentar pegar ou editar o valor de propriedades privadas ou protegidaas de uma classe resultará no disparo de uma exceção. </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.reflectionextension" ><B CLASS="classname" >ReflectionExtension</B ></A ></H2 ><P > A classe <B CLASS="classname" >ReflectionExtension</B > permite fazer engenharia-reversa de extensões. Você pode recuperar todas as extensões em tempo de execução usando a função <A HREF="function.get-loaded-extensions.html" ><B CLASS="function" >get_loaded_extensions()</B ></A >. </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN6123" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionExtension implements Reflector </font><font color="#007700">{<br /> </font><font color="#0000BB">final private __clone</font><font color="#007700">()<br /> </font><font color="#0000BB">public __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br /> </font><font color="#0000BB">public string __toString</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">, </font><font color="#0000BB">bool </font><font color="#007700">return)<br /> </font><font color="#0000BB">public string getName</font><font color="#007700">()<br /> </font><font color="#0000BB">public string getVersion</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionFunction</font><font color="#007700">[] </font><font color="#0000BB">getFunctions</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getConstants</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getINIEntries</font><font color="#007700">()<br /> </font><font color="#0000BB">public ReflectionClass</font><font color="#007700">[] </font><font color="#0000BB">getClasses</font><font color="#007700">()<br /> </font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getClassNames</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><P > Para introspectar um método, você tem que primeiro criar uma instância da classe <B CLASS="classname" >ReflectionProperty</B >. Você pode, então, chamar qualquer um dos métodos acima nessa instância. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6127" ></A ><P ><B >Exemplo 19-39. Usando a classe <B CLASS="classname" >ReflectionExtension</B ></B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">// Cria uma instância da classe ReflectionProperty<br /></font><font color="#0000BB">$ext </font><font color="#007700">= new </font><font color="#0000BB">ReflectionExtension</font><font color="#007700">(</font><font color="#DD0000">'standard'</font><font color="#007700">);<br /><br /></font><font color="#FF8000">// Imprime informação básica<br /></font><font color="#0000BB">printf</font><font color="#007700">(<br /> </font><font color="#DD0000">"Name : %s\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">"Version : %s\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">"Functions : [%d] %s\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">"Constants : [%d] %s\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">"INI entries : [%d] %s\n" </font><font color="#007700">.<br /> </font><font color="#DD0000">"Classes : [%d] %s\n"</font><font color="#007700">,<br /> </font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getName</font><font color="#007700">(),<br /> </font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getVersion</font><font color="#007700">() ? </font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getVersion</font><font color="#007700">() : </font><font color="#DD0000">'NO_VERSION'</font><font color="#007700">,<br /> </font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getFunctions</font><font color="#007700">()),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getFunctions</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /><br /> </font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getConstants</font><font color="#007700">()),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getConstants</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /><br /> </font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getINIEntries</font><font color="#007700">()),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getINIEntries</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /><br /> </font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getClassNames</font><font color="#007700">()),<br /> </font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-></font><font color="#0000BB">getClassNames</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">)<br />);<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.oop5.reflection.extending" >Herdando as classes de reflexão</A ></H2 ><P > Caso você queira criar versões especializdas das classes built-in (digamos, para criar HTML colorido quando sendo exportado, tendo variáveis membros de fácil acesso ao invés de métodos ou tendo métodos utilitários), você pode herdá-las. </P ><TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN6134" ></A ><P ><B >Exemplo 19-40. Herdando as classes built-in</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br /></font><font color="#FF8000">/**<br /> * Minha classe ReflectionMethod<br /> */<br /></font><font color="#007700">class </font><font color="#0000BB">My_Reflection_Method </font><font color="#007700">extends </font><font color="#0000BB">ReflectionMethod<br /></font><font color="#007700">{<br /> </font><font color="#0000BB">public $visibility </font><font color="#007700">= </font><font color="#DD0000">''</font><font color="#007700">;<br /><br /> </font><font color="#0000BB">public </font><font color="#007700">function </font><font color="#0000BB">__construct</font><font color="#007700">(</font><font color="#0000BB">$o</font><font color="#007700">, </font><font color="#0000BB">$m</font><font color="#007700">)<br /> {<br /> </font><font color="#0000BB">parent</font><font color="#007700">::</font><font color="#0000BB">__construct</font><font color="#007700">(</font><font color="#0000BB">$o</font><font color="#007700">, </font><font color="#0000BB">$m</font><font color="#007700">);<br /> </font><font color="#0000BB">$this</font><font color="#007700">-></font><font color="#0000BB">visibility</font><font color="#007700">= </font><font color="#0000BB">Reflection</font><font color="#007700">::</font><font color="#0000BB">getModifierNames</font><font color="#007700">(</font><font color="#0000BB">$this</font><font color="#007700">-></font><font color="#0000BB">getModifiers</font><font color="#007700">());<br /> }<br />}<br /><br /></font><font color="#FF8000">/**<br /> * Classe demo #1<br /> *<br /> */<br /></font><font color="#007700">class </font><font color="#0000BB">T </font><font color="#007700">{<br /> </font><font color="#0000BB">protected </font><font color="#007700">function </font><font color="#0000BB">x</font><font color="#007700">() {}<br />}<br /><br /></font><font color="#FF8000">/**<br /> * Classe demo #2<br /> *<br /> */<br /></font><font color="#007700">class </font><font color="#0000BB">U </font><font color="#007700">extends </font><font color="#0000BB">T </font><font color="#007700">{<br /> function </font><font color="#0000BB">x</font><font color="#007700">() {}<br />}<br /><br /></font><font color="#FF8000">// Imprime informação<br /></font><font color="#0000BB">var_dump</font><font color="#007700">(new </font><font color="#0000BB">My_Reflection_Method</font><font color="#007700">(</font><font color="#DD0000">'U'</font><font color="#007700">, </font><font color="#DD0000">'x'</font><font color="#007700">));<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Cuidado: Se você estiver sobrescrevendo um construtor, lembre-se de chamar o construtor do pai _antes_ de qualquer código que você acrescentar. Não fazer isso resultará no seguinte: <TT CLASS="literal" > Fatal error: Internal error: Failed to retrieve the reflection object </TT > </P ></BLOCKQUOTE ></DIV ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="language.oop5.object-comparison.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >Principal</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="language.oop5.typehinting.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Comparando objetos</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="language.oop5.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Indução de Tipo</TD ></TR ></TABLE ></DIV ></BODY ></HTML >