<?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 => 'fr',
  ),
  'this' => 
  array (
    0 => 'language.namespaces.rules.php',
    1 => 'R&egrave;gles de r&eacute;solution de noms',
    2 => 'R&egrave;gles de r&eacute;solution de noms',
  ),
  'up' => 
  array (
    0 => 'language.namespaces.php',
    1 => 'Les espaces de noms',
  ),
  'prev' => 
  array (
    0 => 'language.namespaces.fallback.php',
    1 => 'Retour sur l\'espace global',
  ),
  'next' => 
  array (
    0 => 'language.namespaces.faq.php',
    1 => 'Foire aux questions',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    '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">Règles de résolution de noms</h2>
  
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p>
  <p class="para">
   Dans le cadre des règles de résolution, il y a plusieurs définitions importantes :
   <dl>
    <strong class="title">Définitions pour les espaces de noms</strong>
    
     <dt>nom non qualifié</dt>
     <dd>
      <p class="para">
       Ceci est un identifiant ne contenant pas un séparateur d&#039;espace de noms.
       Par exemple : <code class="literal">Foo</code>
      </p>
     </dd>
    
    
     <dt>nom qualifié</dt>
     <dd>
      <p class="para">
       Ceci est un identifiant contenant un séparateur d&#039;espace de noms.
       Par exemple : <code class="literal">Foo\Bar</code>
      </p>
     </dd>
    
    
     <dt>Nom absolu</dt>
     <dd>
      <p class="para">
       Ceci est un identifiant qui commence par un séparateur d&#039;espace de noms.
       Par exemple : <code class="literal">\Foo\Bar</code>. le namespace <code class="literal">Foo</code>
       est aussi un nom absolu.
      </p>
     </dd>
    
    
     <dt>Nom Relatif</dt>
     <dd>
      <p class="para">
       C&#039;est un identifiant commençant par <code class="literal">namespace</code>, tel que
       <code class="literal">namespace\Foo\Bar</code>.
      </p>
     </dd>
    
   </dl>
  </p>
  <p class="para">
   Les noms sont résolus en suivant les règles suivantes :
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      Les noms absolus sont toujours résolus en le nom sans le séparateur de namespace initial.
      Par exemple, <code class="literal">\A\B</code> est résolu en <code class="literal">A\B</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Les noms relatifs sont toujours résolus en remplaçant
      <code class="literal">namespace</code> par le namespace courant.
      Si le nom apparaît dans le namespace global, le préfixe
      <code class="literal">namespace\</code> est retiré. Par exemple, <code class="literal">namespace\A</code>
      dans le namespace <code class="literal">X\Y</code> est résolu en <code class="literal">X\Y\A</code>.
      Le même nom dans le namespace global est résolu en <code class="literal">A</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Pour les noms qualifiés, le premier segment est traduit
      en accord avec la table d&#039;importation des class/namespace.
      Par exemple, si le namespace <code class="literal">A\B\C</code> est importé comme <code class="literal">C</code>, le nom <code class="literal">C\D\E</code> est traduit par <code class="literal">A\B\C\D\E</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Pour les noms qualifiés, si aucune règle d&#039;import ne
      s&#039;applique, le namespace courant est préfixé au nom.
      Par exemple le nom <code class="literal">C\D\E</code> dans le namespace <code class="literal">A\B</code>,
      est traduit par <code class="literal">A\B\C\D\E</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Pour les noms non qualifiés, le nom est traduit en lien avec la table courante d&#039;importation pour le type de symbole respectif.
      Cela signifie qu&#039;un nom ressemblant à une classe est traduit en accord avec la table d&#039;importation des
      class/namespace, les noms de fonctions en utilisant la
      table d&#039;importation des fonctions, et les constantes en
      utilisant la table d&#039;importation des constantes.
      Par exemple, après
      <code class="literal">use A\B\C;</code> un usage tel que <code class="literal">new C()</code> correspond au nom
      <code class="literal">A\B\C()</code>. De la même manière, après <code class="literal">use function A\B\foo;</code> un usage
      tel que <code class="literal">foo()</code> correspond au nom <code class="literal">A\B\foo</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Pour les noms non qualifiés, si aucune règle ne s&#039;applique, et que le nom
      fait référence à une classe, le namespace courant sert de préfixe.
      Par exemple <code class="literal">new C()</code> dans le namespace
      <code class="literal">A\B</code> correspond au nom <code class="literal">A\B\C</code>.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Pour les noms non qualifiés, si aucune règle ne s&#039;applique, et que le nom
      fait référence à une fonction ou une constante, et que le code est en
      dehors du namespace global, le nom est résolu à l&#039;exécution.
      Supposons que le code est dans le namespace
      <code class="literal">A\B</code>, voici comment un appel à la fonction <code class="literal">foo()</code> est résolu :
     </span>

     <ol type="1">
      <li class="listitem">
       <span class="simpara">
        Il recherche une fonction dans le namespace courant :
        <code class="literal">A\B\foo()</code>.
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        Il essaie de trouver et appeler la fonction <em>globale</em>
        <code class="literal">foo()</code>.
       </span>
      </li>
     </ol>
    </li>
   </ol>
  </p>
  <div class="example" id="example-1">
   <p><strong>Exemple #1 Exemples de résolutions d&#039;espaces de noms</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">// appels de fonctions<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">();      </span><span style="color: #FF8000">// tente d'appeler la fonction "foo" dans le namespace "A"<br />            // puis appelle la fonction globale "foo"<br /><br /></span><span style="color: #0000BB">\foo</span><span style="color: #007700">();     </span><span style="color: #FF8000">// appelle la fonction "foo" définie dans le namespace global<br /><br /></span><span style="color: #0000BB">my\foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// appelle la fonction "foo" définie dans le namespace "A\my"<br /><br /></span><span style="color: #0000BB">F</span><span style="color: #007700">();        </span><span style="color: #FF8000">// tente d'appeler la fonction "F" définie dans l'espace "A"<br />            // puis tente d'appeler la fonction globale "F"<br /><br />// références de classes<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">B</span><span style="color: #007700">();    </span><span style="color: #FF8000">// crée un objet de la classe "B" définie dans le namespace  "A"<br />            // si non trouvé, il essaie l'autochargement sur la 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">// crée un objet de la classe "D" définie dans le namespace  "B"<br />            // si non trouvé, il essaie l'autochargement sur la 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">// crée un objet de la classe "E" définie dans le namespace  "C"<br />            // si non trouvé, il essaie l'autochargement sur la 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">// crée un objet de la classe "B" définie dans le namespace global<br />            // si non trouvé, il essaie l'autochargement sur la 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">// crée un objet de la classe "D" définie dans le namespace global<br />            // si non trouvé, il essaie l'autochargement sur la 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">// crée un objet de la classe "F" définie dans le namespace global<br />            // si non trouvé, il essaie l'autochargement sur la classe "F"<br /><br />// méthodes statiques et fonctions d'espace de noms d'un autre espace<br /><br /></span><span style="color: #0000BB">B\foo</span><span style="color: #007700">();    </span><span style="color: #FF8000">// appelle la fonction "foo" du 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">// appelle la méthode "foo" de la classe "B" définie dans le namespace  "A"<br />            // si la classe "A\B" n'est pas trouvée, il essaie l'autochargement sur la 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">// appelle la méthode "foo" de la classe "D" définie dans l'espace de noms  "B"<br />            // si la classe "B\D" n'est pas trouvée, il essaie l'autochargement sur la classe "B\D"<br /><br /></span><span style="color: #0000BB">\B\foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// appelle la fonction "foo" de l'espace de noms "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">// appelle la méthode "foo" de la classe "B" située dans l'espace de noms global<br />            // si la classe "B" n'est pas trouvée, il essaie l'autochargement sur la classe "B"<br /><br />// méthodes statiques et fonctions d'espace de noms de l'espace courant<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">// appelle la méthode "foo" de la classe "B" de l'espace de noms "A\A"<br />              // si la classe "A\A\B" n'est pas trouvée, il essaie l'autochargement sur la classe "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">// appelle la méthode "foo" de la classe "B" de l'espace de noms "A"<br />              // si la classe "A\B" n'est pas trouvée, il essaie l'autochargement sur la classe "A\B"<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

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