<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.namespaces.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'language.namespaces.rules.php',
    1 => 'Regras de resolu&ccedil;&atilde;o de nomes',
    2 => 'Regras de resolu&ccedil;&atilde;o de nomes',
  ),
  'up' => 
  array (
    0 => 'language.namespaces.php',
    1 => 'Namespaces',
  ),
  'prev' => 
  array (
    0 => 'language.namespaces.fallback.php',
    1 => 'Recorrendo ao espa&ccedil;o global',
  ),
  'next' => 
  array (
    0 => 'language.namespaces.faq.php',
    1 => 'Perguntas Frequentes',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'language/namespaces.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.namespaces.rules" class="sect1">
  <h2 class="title">Regras de resolução de nomes</h2>
  
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p>
  <p class="para">
   Para efeitos destas regras de resolução, aqui estão algumas definições importantes:
   <dl>
    <strong class="title">Definições de nomes de namespace</strong>
    
     <dt>Nome não qualificado</dt>
     <dd>
      <p class="para">
       Este é um identificador sem separador de namespace, como <code class="literal">Foo</code>.
      </p>
     </dd>
    
    
     <dt>Nome qualificado</dt>
     <dd>
      <p class="para">
       Este é um identificador com separador de namespace, como <code class="literal">Foo\Bar</code>.
      </p>
     </dd>
    
    
     <dt>Nome totalmente qualificado</dt>
     <dd>
      <p class="para">
       Este é um identificador com separador de namespace que começa com um
       separador de namespace, como <code class="literal">\Foo\Bar</code>. O namespace
       <code class="literal">\Foo</code> também é um nome totalmente qualificado.
      </p>
     </dd>
    
    
     <dt>Nome relativo</dt>
     <dd>
      <p class="para">
       Este é um identificador que começa com <code class="literal">namespace</code>, como
       <code class="literal">namespace\Foo\Bar</code>.
      </p>
     </dd>
    
   </dl>
  </p>
  <p class="para">
   Os nomes são resolvidos seguindo estas regras de resolução:
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      Nomes totalmente qualificados sempre são resolvidos para o nome sem separador de namespace à esquerda.
      Por exemplo, <code class="literal">\A\B</code> será resolvido para <code class="literal">A\B</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Nomes relativos sempre são resolvidos para o nome com <code class="literal">namespace</code> substituído
      pelo namespace atual. Se o nome ocorrer no namespace global, o
      prefixo <code class="literal">namespace\</code> será removido. Por exemplo, <code class="literal">namespace\A</code>
      dentro do namespace <code class="literal">X\Y</code> será resolvido para <code class="literal">X\Y\A</code>. O mesmo nome
      dentro do namespace global será resolvido para <code class="literal">A</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Para nomes qualificados, o primeiro segmento do nome será traduzido conforme a tabela
      de importação de classe/namespace atual. Por exemplo, se o namespace <code class="literal">A\B\C</code> for
      importado como <code class="literal">C</code>, o nome <code class="literal">C\D\E</code> será traduzido para
      <code class="literal">A\B\C\D\E</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Para nomes qualificados, se nenhuma regra de importação se aplicar, o namespace atual será prefixo ao
      nome. Por exemplo, o nome <code class="literal">C\D\E</code> dentro do namespace <code class="literal">A\B</code>,
      será resolvido para <code class="literal">A\B\C\D\E</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Para nomes não qualificados, o nome será traduzido conforme a tabela de importação atual para o
      respectivo tipo de símbolo. Isso significa que nomes semelhantes a classes serão traduzidos conforme a
      tabela de importação de classe/namespace, nomes de funções conforme a tabela de importação de funções e
      constantes conforme a tabela de importação de constantes. Por exemplo, após a declaração
      <code class="literal">use A\B\C;</code> um uso como <code class="literal">new C()</code> será resolvido para o nome
      <code class="literal">A\B\C()</code>. Da mesma forma, após a declaração <code class="literal">use function A\B\foo;</code> um uso
      como <code class="literal">foo()</code> será resolvido para o nome <code class="literal">A\B\foo</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Para nomes não qualificados, se nenhuma regra de importação se aplicar e o nome se referir a um símbolo de classe,
      o namespace atual será prefixo. Por exemplo <code class="literal">new C()</code> dentro do namespace
      <code class="literal">A\B</code> será resolvido para o nome <code class="literal">A\B\C</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Para nomes não qualificados, se nenhuma regra de importação se aplicar e o nome se referir a uma função ou constante
      e o código estiver fora do namespace global, o nome será resolvido em tempo de execução.
      Supondo que o código esteja no namespace <code class="literal">A\B</code>, é assim que uma chamada para a função
      <code class="literal">foo()</code> será resolvida:
     </span>
      <ol type="1">
       <li class="listitem">
        <span class="simpara">
         Procura pela função no namespace atual:
         <code class="literal">A\B\foo()</code>.
        </span>
       </li>
       <li class="listitem">
        <span class="simpara">
         Tenta encontrar e chamar a função <em>global</em>
         <code class="literal">foo()</code>.
        </span>
       </li>
      </ol>
    </li>
   </ol>
  </p>
  <div class="example" id="example-1">
   <p><strong>Exemplo #1 Resoluções de nomes ilustradas</strong></p>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">namespace </span><span style="color: #0000BB">A</span><span style="color: #007700">;<br />use </span><span style="color: #0000BB">B\D</span><span style="color: #007700">, </span><span style="color: #0000BB">C\E </span><span style="color: #007700">as </span><span style="color: #0000BB">F</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// chamadas de funções<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">();       </span><span style="color: #FF8000">// primeiro tenta chamar "foo" definida no namespace "A"<br />             // então chama a função global "foo"<br /><br /></span><span style="color: #0000BB">\foo</span><span style="color: #007700">();      </span><span style="color: #FF8000">// chama a função "foo" definida no escopo global<br /><br /></span><span style="color: #0000BB">minha\foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// chama a função "foo" definida no namespace "A\minha"<br /><br /></span><span style="color: #0000BB">F</span><span style="color: #007700">();         </span><span style="color: #FF8000">// primeiro tenta chamar "F" definida no namespace "A"<br />             // e então chama a função global "F"<br /><br />// referências de classe<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">B</span><span style="color: #007700">();    </span><span style="color: #FF8000">// cria um objeto da classe "B" definida no namespace "A"<br />            // se não for encontrada, tenta carregar automaticamente a classe  "A\B"<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">D</span><span style="color: #007700">();    </span><span style="color: #FF8000">// usando regras de importação, cria um objeto da classe "D" definida no namespace "B"<br />            // se não for encontrada, tenta carregar automaticamente a classe "B\D"<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">F</span><span style="color: #007700">();    </span><span style="color: #FF8000">// usando regras de importação, cria um objeto da classe "E" definida no namespace "C"<br />            // se não for encontrada, tenta carregar automaticamente a classe "C\E"<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\B</span><span style="color: #007700">();   </span><span style="color: #FF8000">// cria um objeto da classe "B" definida no escopo global<br />            // se não for encontrada, tenta carregar automaticamente a classe "B"<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\D</span><span style="color: #007700">();   </span><span style="color: #FF8000">// cria um objeto da classe "D" definida no escopo global<br />            // se não for encontrado, tenta carregar automaticamente a classe "D"<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\F</span><span style="color: #007700">();   </span><span style="color: #FF8000">// cria um objeto da classe "F" definida no escopo global<br />            // se não for encontrada, tenta carregar automaticamente a classe "F"<br /><br />// métodos estáticos/funções de namespace de outro namespace<br /><br /></span><span style="color: #0000BB">B\foo</span><span style="color: #007700">();    </span><span style="color: #FF8000">// chama a função "foo" do namespace "A\B"<br /><br /></span><span style="color: #0000BB">B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// chama o método "foo" da classe "B" definida no namespace "A"<br />            // se a classe "A\B" não for encontrada, tenta carregar automaticamente a classe "A\B"<br /><br /></span><span style="color: #0000BB">D</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// usando regras de importação, chama o método "foo" da classe "D" definida no namespace "B"<br />            // se a classe "B\D" não for encontrada, tenta carregar automaticamente a classe "B\D"<br /><br /></span><span style="color: #0000BB">\B\foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// chama a função "foo" do namespace "B"<br /><br /></span><span style="color: #0000BB">\B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();  </span><span style="color: #FF8000">// chama o método "foo" da classe "B" do escopo global<br />            // se a classe "B" não for encontrada, tenta carregar automaticamente a classe "B"<br /><br />// métodos estáticos/funções de namespace do namespace atual<br /><br /></span><span style="color: #0000BB">A\B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// chama o método "foo" da classe "B" do namespace "A\A"<br />              // se a classe "A\A\B" não for encontrada, tenta carregar automaticamente a class "A\A\B"<br /><br /></span><span style="color: #0000BB">\A\B</span><span style="color: #007700">::</span><span style="color: #0000BB">foo</span><span style="color: #007700">();  </span><span style="color: #FF8000">// chama o método "foo" da classe "B" do namespace "A"<br />              // se a classe "A\B" não for encontrada, tenta carregar automaticamente a classe "A\B"<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </div><?php manual_footer($setup); ?>