<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >Escopo de variáveis</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="Variáveis" HREF="language.variables.html"><LINK REL="PREVIOUS" TITLE="Variáveis Predefinidas" HREF="language.variables.predefined.html"><LINK REL="NEXT" TITLE="Variáveis variáveis" HREF="language.variables.variable.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.variables.predefined.html" ACCESSKEY="P" >Anterior</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" >Capítulo 12. Variáveis</TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="language.variables.variable.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="language.variables.scope" >Escopo de variáveis</A ></H1 ><P > O escopo de uma variável é o contexto onde ela foi definida. A maior parte das variáveis do PHP tem somente escopo local. Este escopo local inclui os arquivos incluídos. Por exemplo: </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3738" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$a </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">;<br />include </font><font color="#DD0000">"b.inc"</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><P > Aqui a variável <CODE CLASS="varname" >$a</CODE > estará disponível no script incluído <TT CLASS="filename" >b.inc</TT >. Entretanto, com as funções definidas pelo usuário, um escopo local é introduzido. Quaisquer variáveis utilizadas dento da função é por default limitada dentro do escopo local da função. Por exemplo: </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3743" ></A ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$a </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">; </font><font color="#FF8000">/* escopo global */<br /><br /></font><font color="#007700">function </font><font color="#0000BB">Teste</font><font color="#007700">()<br />{<br /> echo </font><font color="#0000BB">$a</font><font color="#007700">; </font><font color="#FF8000">/* referencia uma variável do escopo local (não definida) */<br /></font><font color="#007700">}<br /><br /></font><font color="#0000BB">Teste</font><font color="#007700">();<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><P > Este script não produz nenhuma saída porque a instrução <A HREF="function.echo.html" ><B CLASS="function" >echo()</B ></A > refere-se a uma versão local da variável <CODE CLASS="varname" >$a</CODE >, e ela não tem nenhum valor assimilado nesse escopo. Essa é uma pequena diferença da linguagem C quando variáveis globais são automaticamente disponíveis para funções sem sobreescrever uma eventual definição local. Isto causa problemas quando as pessoas mudam inadivertidamente uma variável global. No PHP, as variáveis globais precisam ser declaradas globais dentro de uma função se ela vai ser utilizada naquela função. </P ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.variables.scope.global" >A palavra chave global</A ></H2 ><P > Primeiro, um exemplo de <TT CLASS="literal" >global</TT >: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3753" ></A ><P ><B >Exemplo 12-1. Usando global</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$a </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">;<br /></font><font color="#0000BB">$b </font><font color="#007700">= </font><font color="#0000BB">2</font><font color="#007700">;<br /><br />function </font><font color="#0000BB">Soma</font><font color="#007700">()<br />{<br /> global </font><font color="#0000BB">$a</font><font color="#007700">, </font><font color="#0000BB">$b</font><font color="#007700">;<br /><br /> </font><font color="#0000BB">$b </font><font color="#007700">= </font><font color="#0000BB">$a </font><font color="#007700">+ </font><font color="#0000BB">$b</font><font color="#007700">;<br />}<br /><br /></font><font color="#0000BB">Soma</font><font color="#007700">();<br />echo </font><font color="#0000BB">$b</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > O script acima imprimirá "3". Declarando <CODE CLASS="varname" >$a</CODE > e <CODE CLASS="varname" >$b</CODE > globais na função, todas as referências a essas variáveis referem-se a versão global. Não há um limite para o número de variáveis globais que podem ser manipuladas por uma função. </P ><P > Uma segunda maneira de acessar variáveis do escopo global é utilizando o array especial <CODE CLASS="varname" >$GLOBALS</CODE > definido pelo PHP. O exemplo anterior poderia ser rescrito como: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3762" ></A ><P ><B >Exemplo 12-2. Usando <CODE CLASS="varname" >$GLOBALS</CODE > no lugar de global</B ></P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><code><font color="#000000"> <font color="#0000BB"><?php<br />$a </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">;<br /></font><font color="#0000BB">$b </font><font color="#007700">= </font><font color="#0000BB">2</font><font color="#007700">;<br /><br />function </font><font color="#0000BB">Soma</font><font color="#007700">()<br />{<br /> </font><font color="#0000BB">$GLOBALS</font><font color="#007700">[</font><font color="#DD0000">"b"</font><font color="#007700">] = </font><font color="#0000BB">$GLOBALS</font><font color="#007700">[</font><font color="#DD0000">"a"</font><font color="#007700">] + </font><font color="#0000BB">$GLOBALS</font><font color="#007700">[</font><font color="#DD0000">"b"</font><font color="#007700">];<br />}<br /><br /></font><font color="#0000BB">Soma</font><font color="#007700">();<br />echo </font><font color="#0000BB">$b</font><font color="#007700">;<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > O array <CODE CLASS="varname" >$GLOBALS</CODE > é um array associativo onde o nome da variável global é a chave do array e o seu conteúdo da variável como o valor do elemento do array. Veja que <CODE CLASS="varname" >$GLOBALS</CODE > existe em qualquer escopo, isto porque $GLOBALS é uma <A HREF="language.variables.predefined.html#language.variables.superglobals" >superglobal</A >. Segue um exemplo demonstrando o poder das superglobais: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3771" ></A ><P ><B >Exemplo 12-3. Exemplo demonstrando superglobals e escopos</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">test_global</font><font color="#007700">()<br />{<br /> </font><font color="#FF8000">// A maioria das variaveis predefinidas nao sao 'super' e requerem<br /> // 'global' para serem disponiveis para funcoes em qualquer escopo.<br /> </font><font color="#007700">global </font><font color="#0000BB">$HTTP_POST_VARS</font><font color="#007700">;<br /><br /> echo </font><font color="#0000BB">$HTTP_POST_VARS</font><font color="#007700">[</font><font color="#DD0000">'name'</font><font color="#007700">];<br /><br /> </font><font color="#FF8000">// Superglobais são disponiveis em qualquer escopo e<br /> // nao precisam de 'global'. Superglobais existem<br /> // desde o PHP 4.1.0<br /> </font><font color="#007700">echo </font><font color="#0000BB">$_POST</font><font color="#007700">[</font><font color="#DD0000">'name'</font><font color="#007700">];<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.variables.scope.static" >Utilizando variáveis estáticas</A ></H2 ><P > Outro recurso importante do escopo de variáveis é a variável <SPAN CLASS="emphasis" ><I CLASS="emphasis" >estática</I ></SPAN >. Uma variável estática existe somente no escopo local da função, mas ela não perde seu valor quando o nível de execução do programa deixa o escopo. Considere o seguinte exemplo: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3779" ></A ><P ><B >Exemplo 12-4. Exemplo demonstrando a necessidade de variáveis estáticas</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">Teste </font><font color="#007700">()<br />{<br /> </font><font color="#0000BB">$a </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /> echo </font><font color="#0000BB">$a</font><font color="#007700">;<br /> </font><font color="#0000BB">$a</font><font color="#007700">++;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > Essa função é inútil partindo de que cada vez que ela é chamada, ela coloca em <CODE CLASS="varname" >$a</CODE > o valor <TT CLASS="literal" >0</TT > e imprime "0". A instrução <CODE CLASS="varname" >$a</CODE >++ , que aumenta o valor da variável não tem sentido desde que a função sai e a variável <CODE CLASS="varname" >$a</CODE > desaparece. Para faze-la mais útil como contadora sem deixar de perder o sua conta atual, a variável <CODE CLASS="varname" >$a</CODE > é declarada como estática: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3789" ></A ><P ><B >Exemplo 12-5. Exemplo de uso de variáveis estáticas</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">Teste</font><font color="#007700">()<br />{<br /> static </font><font color="#0000BB">$a </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /> echo </font><font color="#0000BB">$a</font><font color="#007700">;<br /> </font><font color="#0000BB">$a</font><font color="#007700">++;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><P > Agora, cada vez que a função Teste() for chamada ele imprimirá o valor de <CODE CLASS="varname" >$a</CODE > e o incrementará. </P ><P > Variáveis estáticas fornecem uma solução ideal para funções recursivas. Uma função recursiva é aquela se chama a si mesma. Cuidados especiais precisam ser tomados quando escrevendo funções recursivas porque é possível que ela continue na recursão indefinidamente. Você tem de ter certeza que há uma maneira segura de terminar a recursão. A seguinte função recursiva conta até 10, utilizando a variável estática <CODE CLASS="varname" >$count</CODE > para saber quando parar: </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3797" ></A ><P ><B >Exemplo 12-6. Variáveis estáticas em funções recursivas</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">Teste</font><font color="#007700">()<br />{<br /> static </font><font color="#0000BB">$count </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">;<br /><br /> </font><font color="#0000BB">$count</font><font color="#007700">++;<br /> echo </font><font color="#0000BB">$count</font><font color="#007700">;<br /> if (</font><font color="#0000BB">$count </font><font color="#007700">< </font><font color="#0000BB">10</font><font color="#007700">) {<br /> </font><font color="#0000BB">Test </font><font color="#007700">();<br /> }<br /> </font><font color="#0000BB">$count</font><font color="#007700">--;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ><DIV CLASS="note" ><BLOCKQUOTE CLASS="note" ><P ><B >Nota: </B > Variáveis estáticas podem ser declaradas como nos exemplos acima. A tentativa de assimilar valores para essas variáveis com resultados de expressões causarão um erro de interpretação (parse). </P ><P > <TABLE WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" CLASS="EXAMPLE" ><TR ><TD ><DIV CLASS="example" ><A NAME="AEN3803" ></A ><P ><B >Exemplo 12-7. Declarando variáveis static</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">(){<br /> static </font><font color="#0000BB">$int </font><font color="#007700">= </font><font color="#0000BB">0</font><font color="#007700">; </font><font color="#FF8000">// correro<br /> </font><font color="#007700">static </font><font color="#0000BB">$int </font><font color="#007700">= </font><font color="#0000BB">1</font><font color="#007700">+</font><font color="#0000BB">2</font><font color="#007700">; </font><font color="#FF8000">// errado (é uma expressão)<br /> </font><font color="#007700">static </font><font color="#0000BB">$int </font><font color="#007700">= </font><font color="#0000BB">sqrt</font><font color="#007700">(</font><font color="#0000BB">121</font><font color="#007700">); </font><font color="#FF8000">// wrong (é uma expressão também)<br /><br /> </font><font color="#0000BB">$int</font><font color="#007700">++;<br /> echo </font><font color="#0000BB">$int</font><font color="#007700">;<br />}<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE > </P ></BLOCKQUOTE ></DIV ></DIV ><DIV CLASS="sect2" ><H2 CLASS="sect2" ><A NAME="language.variables.scope.references" >Referencias em variáveis globais e estáticas</A ></H2 ><P > A Zend Engine 1, base do <TT CLASS="literal" >PHP 4</TT >, implementa os modificadores <A HREF="language.variables.scope.html#language.variables.scope.static" >static</A > e <A HREF="language.variables.scope.html#language.variables.scope.global" >global</A > para variáveis na questão de <A HREF="language.references.html" > referências</A >. Por exemplo, uma veriável global importada dentro do escopo de uma função com a instrução <TT CLASS="literal" >global</TT > atualmente cria uma referência para a variável global. Isto pode causar comportamentos impresíveis para os seguintes casos: </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3814" ></A ><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">test_global_ref</font><font color="#007700">() {<br /> global </font><font color="#0000BB">$obj</font><font color="#007700">;<br /> </font><font color="#0000BB">$obj </font><font color="#007700">= &new </font><font color="#0000BB">stdclass</font><font color="#007700">;<br />}<br /><br />function </font><font color="#0000BB">test_global_noref</font><font color="#007700">() {<br /> global </font><font color="#0000BB">$obj</font><font color="#007700">;<br /> </font><font color="#0000BB">$obj </font><font color="#007700">= new </font><font color="#0000BB">stdclass</font><font color="#007700">;<br />}<br /><br /></font><font color="#0000BB">test_global_ref</font><font color="#007700">();<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">test_global_noref</font><font color="#007700">();<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 ><P ></P ></DIV ><P > Executando esse exemplo você terá as seguites saídas: </P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="screen" >NULL object(stdClass)(0) { }</PRE ></TD ></TR ></TABLE ><P > Uma situação similar se aplica ao modificador <TT CLASS="literal" >static</TT >. Referências não são armazenadas estaticamente: </P ><DIV CLASS="informalexample" ><P ></P ><A NAME="AEN3820" ></A ><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">get_instance_ref</font><font color="#007700">() {<br /> static </font><font color="#0000BB">$obj</font><font color="#007700">;<br /><br /> echo </font><font color="#DD0000">"Objeto estatico: "</font><font color="#007700">;<br /> </font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$obj</font><font color="#007700">);<br /> if (!isset(</font><font color="#0000BB">$obj</font><font color="#007700">)) {<br /> </font><font color="#FF8000">// Assimila uma referencia a variavel estatica<br /> </font><font color="#0000BB">$obj </font><font color="#007700">= &new </font><font color="#0000BB">stdclass</font><font color="#007700">;<br /> }<br /> </font><font color="#0000BB">$obj</font><font color="#007700">-></font><font color="#0000BB">property</font><font color="#007700">++;<br /> return </font><font color="#0000BB">$obj</font><font color="#007700">;<br />}<br /><br />function &</font><font color="#0000BB">get_instance_noref</font><font color="#007700">() {<br /> static </font><font color="#0000BB">$obj</font><font color="#007700">;<br /><br /> echo </font><font color="#DD0000">"Objeto estatico: "</font><font color="#007700">;<br /> </font><font color="#0000BB">var_dump</font><font color="#007700">(</font><font color="#0000BB">$obj</font><font color="#007700">);<br /> if (!isset(</font><font color="#0000BB">$obj</font><font color="#007700">)) {<br /> </font><font color="#FF8000">// Assimila o objeto para a veriavel estatica<br /> </font><font color="#0000BB">$obj </font><font color="#007700">= new </font><font color="#0000BB">stdclass</font><font color="#007700">;<br /> }<br /> </font><font color="#0000BB">$obj</font><font color="#007700">-></font><font color="#0000BB">property</font><font color="#007700">++;<br /> return </font><font color="#0000BB">$obj</font><font color="#007700">;<br />}<br /><br /></font><font color="#0000BB">$obj1 </font><font color="#007700">= </font><font color="#0000BB">get_instance_ref</font><font color="#007700">();<br /></font><font color="#0000BB">$still_obj1 </font><font color="#007700">= </font><font color="#0000BB">get_instance_ref</font><font color="#007700">();<br />echo </font><font color="#DD0000">"\n"</font><font color="#007700">;<br /></font><font color="#0000BB">$obj2 </font><font color="#007700">= </font><font color="#0000BB">get_instance_noref</font><font color="#007700">();<br /></font><font color="#0000BB">$still_obj2 </font><font color="#007700">= </font><font color="#0000BB">get_instance_noref</font><font color="#007700">();<br /></font><font color="#0000BB">?></font> </font> </code></TD ></TR ></TABLE ><P ></P ></DIV ><P > Executando esse exemplo você terá as seguites saídas: </P ><TABLE BORDER="0" BGCOLOR="#E0E0E0" CELLPADDING="5" ><TR ><TD ><PRE CLASS="screen" >Objeto estatico: NULL Objeto estatico: NULL Objeto estatico: NULL Objeto estatico: object(stdClass)(1) { ["property"]=> int(1) }</PRE ></TD ></TR ></TABLE ><P > Este exemplo demonstra que quando assimilando uma referência para uma variável estática, ela <SPAN CLASS="emphasis" ><I CLASS="emphasis" >não se lembra</I ></SPAN > quando você chama a função <TT CLASS="literal" >&get_instance_ref()</TT > uma segunda vez. </P ></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.variables.predefined.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.variables.variable.html" ACCESSKEY="N" >Próxima</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >Variáveis Predefinidas</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="language.variables.html" ACCESSKEY="U" >Acima</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >Variáveis variáveis</TD ></TR ></TABLE ></DIV ></BODY ></HTML >