<?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 => 'de',
  ),
  'this' => 
  array (
    0 => 'language.namespaces.rules.php',
    1 => 'Regeln f&uuml;r Namensaufl&ouml;sung',
    2 => 'Regeln f&uuml;r Namensaufl&ouml;sung',
  ),
  'up' => 
  array (
    0 => 'language.namespaces.php',
    1 => 'Namespaces',
  ),
  'prev' => 
  array (
    0 => 'language.namespaces.fallback.php',
    1 => 'R&uuml;ckgriff auf den globalen Namespace',
  ),
  'next' => 
  array (
    0 => 'language.namespaces.faq.php',
    1 => 'FAQ',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'de',
    '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">Regeln für Namensauflösung</h2>
  
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p>
  <p class="para">
   Hier einige wichtige Definitionen für die Zwecke der Namensauflösungsregeln:
   <dl>
    <strong class="title">Namespace-Namen-Definitionen</strong>
    
     <dt>Unqualifizierter Name</dt>
     <dd>
      <p class="para">
       Dies ist ein Bezeichner ohne einen Namespaceseparator, z. B.
       <code class="literal">Foo</code>
      </p>
     </dd>
    
    
     <dt>Qualifizierter Name</dt>
     <dd>
      <p class="para">
       Dies ist ein Bezeichner mit einem Namespaceseparator, z. B.
       <code class="literal">Foo\Bar</code>
      </p>
     </dd>
    
    
     <dt>Vollständig qualifizierter Name</dt>
     <dd>
      <p class="para">
       Dies ist ein Bezeichner mit einem Namespaceseparator, der mit einem
       Namespaceseparator beginnt, z. B. <code class="literal">\Foo\Bar</code>. Der
       Namespace <code class="literal">namespace\Foo</code> ist ebenfalls ein
       vollständig qualifizierter Name.
      </p>
     </dd>
    
    
     <dt>Relativer Name</dt>
     <dd>
      <p class="para">
       Dies ist ein Bezeichner, der mit <code class="literal">namespace</code> beginnt, wie
       etwa <code class="literal">namespace\Foo\Bar</code>.
      </p>
     </dd>
    
   </dl>
  </p>
  <p class="para">
   Namen werden gemäß den folgenden Regeln aufgelöst:
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      Vollständig qualifizierte Namens werden immer zu dem Namen ohne führenden
      Namensraumtrenner aufgelöst. <code class="literal">\A\B</code> wird
      z. B. zu <code class="literal">A\B</code> aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Relative Namen werden immer zu dem Namen aufgelöst, in dem <code class="literal">namespace</code>
      durch den aktuellen Namensraum ersetzt wurde. Taucht der Namen im globalen
      Geltungsbereich auf, wird das <code class="literal">namespace\</code>-Präfix entfernt.
      Beispielsweise wird <code class="literal">namespace\A</code> innerhalb des Namensraums
      <code class="literal">X\Y</code> zu <code class="literal">X\Y\A</code> aufgelöst. Derselbe Name
      im globalen Geltungsbereich wird zu <code class="literal">A</code> aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Für qualifizierte Namen wird das erste Segment des Namens gemäß der aktuellen
      Klassen-/Namensraum-Importtabelle übersetzt. Wird beispielsweise der Namensraum
      <code class="literal">A\B\C</code> als <code class="literal">C</code> importiert, wird der Name
      <code class="literal">C\D\E</code> zu <code class="literal">A\B\C\D\E</code> übersetzt.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Wenn für qualifizierte Namen keine Importregel zutrifft, wird der aktuelle Namensraum
      dem Namen vorangestellt. Beispielsweise wird der Name <code class="literal">C\D\E</code>
      innerhalb des Namensraums <code class="literal">A\B</code> zu <code class="literal">A\B\C\D\E</code>
      aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Für unqualifizierte Namen wird der Name gemäß der aktuellen Importtabelle für
      die betreffende Symboltabelle übersetzt. Das bedeutet, dass klassenartige
      Namen gemäß der Klassen-/Namensraum-Importtabelle, Funktionsnamen gemäß der
      Funktions-Importtabelle und Konstantennamen gemäß der Konstanten-Importtabelle
      übersetzt werden. Beispielsweise wird nach <code class="literal">use A\B\C;</code> eine
      Verwendung wie etwa <code class="literal">new C()</code> zum Namen <code class="literal">A\B\C()</code>
      aufgelöst. Analog wird nach <code class="literal">use function A\B\foo;</code> eine
      Verwendung wie etwa <code class="literal">foo()</code> zum Namen <code class="literal">A\B\foo</code>
      aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Wenn für unqualifizierte Namen keine Importregel zutrifft, und sich der Name
      auf ein klassenartiges Symbol bezieht, wird der aktuelle Namensraum vorangestellt.
      Beispielsweise wird <code class="literal">new C()</code> innerhalb des Namensraums
      <code class="literal">A\B</code> zum Namen <code class="literal">A\B\C</code> aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Wenn für unqualifizierte Namen keine Importregel zutrifft, und sich der Name
      auf eine Funktion oder Konstante bezieht, und der Code sich außerhalb des
      globalen Geltungsbereichs befindet, wird der Name zur Laufzeit aufgelöst.
      Angenommen der Code befindet sich im Namensraum <code class="literal">A\B</code>, wird
      im folgenden erläutert, wie der Aufruf einer Funktion <code class="literal">foo()</code>
      aufgelöst wird:
     </span>
     <ol type="1">
      <li class="listitem">
       <span class="simpara">
        Zuerst wird nach der Funktion im aktuellen Namespace gesucht:
        <code class="literal">A\B\foo()</code>.
       </span>
      </li>
      <li class="listitem">
       <span class="simpara">
        Es wird versucht, die Funktion <code class="literal">foo()</code> im
        <em>globalen</em> Namensraum zu finden und aufzurufen.
       </span>
      </li>
     </ol>
    </li>
   </ol>
  </p>
  <div class="example" id="example-1">
   <p><strong>Beispiel #1 Illustration der Namensauflösung</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">// Funktionsaufrufe<br /><br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">();      </span><span style="color: #FF8000">// versucht zuerst die Funktion "foo" im Namespace "A" aufzurufen<br />            // danach wird die globale Funktion "foo" aufgerufen<br /><br /></span><span style="color: #0000BB">\foo</span><span style="color: #007700">();     </span><span style="color: #FF8000">// ruft die Funktion "foo" im globalen Namensraum auf<br /><br /></span><span style="color: #0000BB">my\foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// ruft die Funktion "foo" im Namespace "A\my" auf<br /><br /></span><span style="color: #0000BB">F</span><span style="color: #007700">();        </span><span style="color: #FF8000">// versucht zuerst die Funktion "F" im Namespace "A" aufzurufen,<br />            // danach wird die globale Funktion "F" aufgerufen<br /><br />// Klassenreferenzen<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">B</span><span style="color: #007700">();    </span><span style="color: #FF8000">// erzeugt ein Objekt der Klasse "B" im Namespace "A"<br />            // wenn diese Klasse nicht bekannt ist, so wird versucht per<br />            //  Autoload die Klasse "A\B" zu laden<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">D</span><span style="color: #007700">();    </span><span style="color: #FF8000">// gemäß den Importregeln wird ein Objekt der Klasse "D"<br />            //  aus dem Namenspace "B" erzeugt<br />            // wenn diese Klasse nicht bekannt ist, so wird versucht per<br />            //  Autoload die Klasse "B\D" zu laden<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">F</span><span style="color: #007700">();    </span><span style="color: #FF8000">// gemäß den Importregeln wird ein Objekt der Klasse "E"<br />            //  aus dem Namespace "C" erzeugt<br />            // wenn diese Klasse nicht bekannt ist, so wird versucht per<br />            //  Autoload die Klasse "C\E" zu laden<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\B</span><span style="color: #007700">();   </span><span style="color: #FF8000">// erzeugt ein Objekt der Klasse "B" aus dem globalen Namensraum<br />            // wenn diese Klasse nicht bekannt ist, so wird versucht per<br />            //  Autoload die Klasse "B" zu laden<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\D</span><span style="color: #007700">();   </span><span style="color: #FF8000">// erzeugt ein Objekt der Klasse "D" aus dem globalen Namensraum<br />            // wenn diese Klasse nicht bekannt ist, so wird versucht per<br />            //  Autoload die Klasse "D" zu laden<br /><br /></span><span style="color: #007700">new </span><span style="color: #0000BB">\F</span><span style="color: #007700">();   </span><span style="color: #FF8000">// erzeugt ein Objekt der Klasse "F" aus dem globalen Namensraum<br />            // wenn diese Klasse nicht bekannt ist, so wird versucht per<br />            //  Autoload die Klasse "F" zu laden<br /><br />// statische Methoden und Funktionen mit Namespace aus anderen Namespaces<br /><br /></span><span style="color: #0000BB">B\foo</span><span style="color: #007700">();    </span><span style="color: #FF8000">// ruft die Funktion "foo" aus dem Namensraum "A\B" auf<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">// ruft die Methode "foo" der Klasse "B" im Namensraum "A" auf<br />            // wenn die Klasse "A\B" nicht bekannt ist, so wird versucht<br />            //  die Klasse "A\B" mittels Autoload zu laden<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">// ruft gemäß den Importregeln die Methode "foo" der Klasse "D"<br />            //  im Namensraum "B" auf<br />            // wenn die Klasse "B\D" nicht bekannt ist, so wird versucht<br />            //  die Klasse "B\D" mittels Autoload zu laden<br /><br /></span><span style="color: #0000BB">\B\foo</span><span style="color: #007700">();   </span><span style="color: #FF8000">// ruft die Funktion "foo" im Namespace "B" auf<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">// ruft die Methode "foo" der Klasse "B" im<br />           //   globalen Namensraum auf<br />            // wenn die Klasse "B" nicht bekannt ist, so wird versucht<br />            //  die Klasse "B" mittels Autoload zu laden<br /><br />// statische Methoden und Funktionen mit Namespace aus den gleichen Namespaces<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">// ruft die Methode "foo" der Klasse "B" aus dem Namespace "A\A" auf<br />              // wenn die Klasse "A\A\B" nicht bekannt ist, so wird<br />              //  versucht die Klasse "A\A\B" mittels Autoload zu laden<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">// ruft die Methode "foo" der Klasse "B" aus dem Namespace "A" auf<br />              // wenn die Klasse "A\B" nicht bekannt ist, so wird<br />              //  versucht die Klasse "A\B" mittels Autoload zu laden<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

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