Sophie

Sophie

distrib > Mandriva > 2008.1 > i586 > by-pkgid > 703d980c580707c382b4e43e25965bc5 > files > 10700

php-manual-pt_BR-5.2.4-1mdv2008.1.noarch.rpm

<!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
>&#13;    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
>&#13;    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">&lt;?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">?&gt;</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
>&#13;    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">&lt;?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">?&gt;</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 [ &#60;internal&#62; class Exception ] {

  - Constants [0] {
  }

  - Static properties [0] {
  }

  - Static methods [0] {
  }

  - Properties [6] {
    Property [ &#60;default&#62; protected $message ]
    Property [ &#60;default&#62; private $string ]
    Property [ &#60;default&#62; protected $code ]
    Property [ &#60;default&#62; protected $file ]
    Property [ &#60;default&#62; protected $line ]
    Property [ &#60;default&#62; private $trace ]
  }

  - Methods [9] {
    Method [ &#60;internal&#62; final private method __clone ] {
    }

    Method [ &#60;internal&#62; &#60;ctor&#62; public method __construct ] {

      - Parameters [2] {
        Parameter #0 [ &#60;required&#62; $message ]
        Parameter #1 [ &#60;required&#62; $code ]
      }
    }

    Method [ &#60;internal&#62; final public method getMessage ] {
    }

    Method [ &#60;internal&#62; final public method getCode ] {
    }

    Method [ &#60;internal&#62; final public method getFile ] {
    }

    Method [ &#60;internal&#62; final public method getLine ] {
    }

    Method [ &#60;internal&#62; final public method getTrace ] {
    }

    Method [ &#60;internal&#62; final public method getTraceAsString ] {
    }

    Method [ &#60;internal&#62; 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
>&#13;     <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
>&#13;    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">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionFunction implements Reflector<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final private __clone</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string __toString</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isInternal</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isUserDefined</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getFileName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getStartLine</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getEndLine</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getStaticVariables</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public mixed invoke</font><font color="#007700">(</font><font color="#0000BB">mixed args</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public mixed invokeArgs</font><font color="#007700">(array </font><font color="#0000BB">args</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool returnsReference</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionParameter</font><font color="#007700">[] </font><font color="#0000BB">getParameters</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getNumberOfParameters</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getNumberOfRequiredParameters</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?&gt;</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
>&#13;    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">&lt;?php<br /></font><font color="#FF8000">/**<br /> * Um contador simples<br /> *<br /> * @return&nbsp;&nbsp;&nbsp;&nbsp;int<br /> */<br /></font><font color="#007700">function </font><font color="#0000BB">counter</font><font color="#007700">()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;static </font><font color="#0000BB">$c </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"===&gt; The %s function '%s'\n"</font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declared in %s\n"</font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines %d to %d\n"</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$func</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$func</font><font color="#007700">-&gt;</font><font color="#0000BB">getName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$func</font><font color="#007700">-&gt;</font><font color="#0000BB">getFileName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$func</font><font color="#007700">-&gt;</font><font color="#0000BB">getStartLine</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$func</font><font color="#007700">-&gt;</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">"---&gt; 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">-&gt;</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">-&gt;</font><font color="#0000BB">getStaticVariables</font><font color="#007700">())<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---&gt; 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">"---&gt; 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">-&gt;</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">?&gt;</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
>&#13;    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">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionParameter implements Reflector<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final private __clone</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string __toString</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isPassedByReference</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionClass getClass</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isArray</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool allowsNull</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isOptional</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isDefaultValueAvailable</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public mixed getDefaultValue</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?&gt;</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
>&#13;    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">&lt;?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">, &amp;</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">-&gt;</font><font color="#0000BB">getParameters</font><font color="#007700">() as </font><font color="#0000BB">$i </font><font color="#007700">=&gt; </font><font color="#0000BB">$param</font><font color="#007700">) {<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">printf</font><font color="#007700">(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"-- Parameter #%d: %s {\n"</font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;Class: %s\n"</font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;Allows NULL: %s\n"</font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;Passed to by reference: %s\n"</font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;Is optional?: %s\n"</font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"}\n"</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$i</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$param</font><font color="#007700">-&gt;</font><font color="#0000BB">getName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$param</font><font color="#007700">-&gt;</font><font color="#0000BB">getClass</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$param</font><font color="#007700">-&gt;</font><font color="#0000BB">allowsNull</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$param</font><font color="#007700">-&gt;</font><font color="#0000BB">isPassedByReference</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$param</font><font color="#007700">-&gt;</font><font color="#0000BB">isOptional</font><font color="#007700">() ? </font><font color="#DD0000">'yes' </font><font color="#007700">: </font><font color="#DD0000">'no'<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#007700">);<br />}<br /></font><font color="#0000BB">?&gt;</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
>&#13;    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">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionClass implements Reflector<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final private __clone</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string __toString</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">static </font><font color="#0000BB">string export</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isInternal</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isUserDefined</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isInstantiable</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool hasConstant</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool hasMethod</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool hasProperty</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getFileName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getStartLine</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getEndLine</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionMethod getConstructor</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionMethod getMethod</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionMethod</font><font color="#007700">[] </font><font color="#0000BB">getMethods</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionProperty getProperty</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionProperty</font><font color="#007700">[] </font><font color="#0000BB">getProperties</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getConstants</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public mixed getConstant</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionClass</font><font color="#007700">[] </font><font color="#0000BB">getInterfaces</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isInterface</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isAbstract</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isFinal</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getModifiers</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isInstance</font><font color="#007700">(</font><font color="#0000BB">stdclass object</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public stdclass newInstance</font><font color="#007700">(</font><font color="#0000BB">mixed args</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionClass getParentClass</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isSubclassOf</font><font color="#007700">(</font><font color="#0000BB">ReflectionClass </font><font color="#007700">class)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getStaticProperties</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getDefaultProperties</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isIterateable</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool implementsInterface</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionExtension getExtension</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getExtensionName</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?&gt;</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
>&#13;    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">&lt;?php<br />interface Serializable<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">// ...<br /></font><font color="#007700">}<br /><br />class </font><font color="#0000BB">Object<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;const </font><font color="#0000BB">START </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Contador de invocação<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @access&nbsp;&nbsp;public<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @return&nbsp;&nbsp;int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">function </font><font color="#0000BB">count</font><font color="#007700">() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return </font><font color="#0000BB">self</font><font color="#007700">::</font><font color="#0000BB">$c</font><font color="#007700">++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"===&gt; The %s%s%s %s '%s' [extends %s]\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declared in %s\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines %d to %d\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;having the modifiers %d [%s]\n"</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</font><font color="#0000BB">getName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</font><font color="#0000BB">getParentClass</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</font><font color="#0000BB">getFileName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</font><font color="#0000BB">getStartLine</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</font><font color="#0000BB">getEndline</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$class</font><font color="#007700">-&gt;</font><font color="#0000BB">getModifiers</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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">-&gt;</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">"---&gt; 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">-&gt;</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">"---&gt; 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">-&gt;</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">"---&gt; 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">-&gt;</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">"---&gt; 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">-&gt;</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">"---&gt; 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">-&gt;</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">-&gt;</font><font color="#0000BB">isInstantiable</font><font color="#007700">()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$counter </font><font color="#007700">= </font><font color="#0000BB">$class</font><font color="#007700">-&gt;</font><font color="#0000BB">newInstance</font><font color="#007700">();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;echo </font><font color="#DD0000">'---&gt; $counter is instance? '</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo </font><font color="#0000BB">$class</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;echo </font><font color="#DD0000">"\n---&gt; new Object() is instance? "</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;echo </font><font color="#0000BB">$class</font><font color="#007700">-&gt;</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">?&gt;</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-&#62;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
>&#13;    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">&lt;?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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final private __clone</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public object __construct</font><font color="#007700">(</font><font color="#0000BB">mixed object</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string __toString</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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">?&gt;</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
>&#13;    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">&lt;?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 />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string __toString</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isFinal</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isAbstract</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isPublic</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isPrivate</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isProtected</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isStatic</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isConstructor</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isDestructor</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getModifiers</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionClass getDeclaringClass</font><font color="#007700">()<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">// Herdado de ReflectionFunction<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final private __clone</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isInternal</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isUserDefined</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getFileName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getStartLine</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getEndLine</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getStaticVariables</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool returnsReference</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionParameter</font><font color="#007700">[] </font><font color="#0000BB">getParameters</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getNumberOfParameters</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getNumberOfRequiredParameters</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
><P
></P
></DIV
><P
>&#13;    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">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">Counter<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* Incrementa o contador<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @final<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @static<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @access&nbsp;&nbsp;public<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* @return&nbsp;&nbsp;int<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final public </font><font color="#007700">static function </font><font color="#0000BB">increment</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ++</font><font color="#0000BB">self</font><font color="#007700">::</font><font color="#0000BB">$c</font><font color="#007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"===&gt; The %s%s%s%s%s%s%s method '%s' (which is %s)\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;declared in %s\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines %d to %d\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;having the modifiers %d[%s]\n"</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</font><font color="#0000BB">getName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</font><font color="#0000BB">getFileName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</font><font color="#0000BB">getStartLine</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</font><font color="#0000BB">getEndline</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$method</font><font color="#007700">-&gt;</font><font color="#0000BB">getModifiers</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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">-&gt;</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">"---&gt; 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">-&gt;</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">-&gt;</font><font color="#0000BB">getStaticVariables</font><font color="#007700">()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">printf</font><font color="#007700">(</font><font color="#DD0000">"---&gt; 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">"---&gt; 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">-&gt;</font><font color="#0000BB">invoke</font><font color="#007700">(</font><font color="#0000BB">NULL</font><font color="#007700">));<br /></font><font color="#0000BB">?&gt;</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
>&#13;    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">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionProperty implements Reflector<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final private __clone</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string __toString</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isPublic</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isPrivate</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isProtected</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isStatic</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public bool isDefault</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public int getModifiers</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public mixed getValue</font><font color="#007700">(</font><font color="#0000BB">stdclass object</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionClass getDeclaringClass</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getDocComment</font><font color="#007700">()<br />}<br /></font><font color="#0000BB">?&gt;</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
>&#13;    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">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">String<br /></font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public $length&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"===&gt; The%s%s%s%s property '%s' (which was %s)\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;having the modifiers %s\n"</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$prop</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$prop</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$prop</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$prop</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$prop</font><font color="#007700">-&gt;</font><font color="#0000BB">getName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$prop</font><font color="#007700">-&gt;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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">-&gt;</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">"---&gt; 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">-&gt;</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">-&gt;</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">"---&gt; 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">-&gt;</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">?&gt;</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
>&#13;    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">&lt;?php<br /></font><font color="#007700">class </font><font color="#0000BB">ReflectionExtension implements Reflector </font><font color="#007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">final private __clone</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public __construct</font><font color="#007700">(</font><font color="#0000BB">string name</font><font color="#007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string __toString</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getName</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public string getVersion</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionFunction</font><font color="#007700">[] </font><font color="#0000BB">getFunctions</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getConstants</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public </font><font color="#007700">array </font><font color="#0000BB">getINIEntries</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public ReflectionClass</font><font color="#007700">[] </font><font color="#0000BB">getClasses</font><font color="#007700">()<br />&nbsp;&nbsp;&nbsp;&nbsp;</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">?&gt;</font>
</font>
</code></TD
></TR
></TABLE
><P
></P
></DIV
><P
>&#13;    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">&lt;?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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: %s\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"Version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: %s\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"Functions&nbsp;&nbsp;&nbsp;: [%d] %s\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"Constants&nbsp;&nbsp;&nbsp;: [%d] %s\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"INI entries : [%d] %s\n" </font><font color="#007700">.<br />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#DD0000">"Classes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;: [%d] %s\n"</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getName</font><font color="#007700">(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getVersion</font><font color="#007700">() ? </font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getVersion</font><font color="#007700">() : </font><font color="#DD0000">'NO_VERSION'</font><font color="#007700">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getFunctions</font><font color="#007700">()),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getFunctions</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getConstants</font><font color="#007700">()),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getConstants</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getINIEntries</font><font color="#007700">()),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getINIEntries</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">),<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">sizeof</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getClassNames</font><font color="#007700">()),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">var_export</font><font color="#007700">(</font><font color="#0000BB">$ext</font><font color="#007700">-&gt;</font><font color="#0000BB">getClassNames</font><font color="#007700">(), </font><font color="#0000BB">1</font><font color="#007700">)<br />);<br /></font><font color="#0000BB">?&gt;</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
>&#13;   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">&lt;?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 />&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">public $visibility </font><font color="#007700">= </font><font color="#DD0000">''</font><font color="#007700">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#0000BB">$this</font><font color="#007700">-&gt;</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">-&gt;</font><font color="#0000BB">getModifiers</font><font color="#007700">());<br />&nbsp;&nbsp;&nbsp;&nbsp;}<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 />&nbsp;&nbsp;&nbsp;&nbsp;</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 />&nbsp;&nbsp;&nbsp;&nbsp;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">?&gt;</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"
>&#13;      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
>