<?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.basics.php',
    1 => 'Grundlagen',
    2 => 'Namespaces verwenden: Grundlagen',
  ),
  'up' => 
  array (
    0 => 'language.namespaces.php',
    1 => 'Namespaces',
  ),
  'prev' => 
  array (
    0 => 'language.namespaces.definitionmultiple.php',
    1 => 'Mehrere Namespaces in derselben Datei definieren',
  ),
  'next' => 
  array (
    0 => 'language.namespaces.dynamic.php',
    1 => 'Namespaces und dynamische Sprachfeatures',
  ),
  '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.basics" class="sect1">
  <h2 class="title">Namespaces verwenden: Grundlagen</h2>
  
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p>
  <p class="para">
   Bevor die Verwendung von Namespaces besprochen wird, ist es wichtig zu
   verstehen, woher PHP weiß, welches Element mit Namespace vom Code
   angefordert wird. Eine einfache Analogie kann zwischen PHP-Namensräumen und
   einem Dateisystem gesehen werden. Es gibt drei Möglichkeiten, mit denen man
   auf eine Datei in einem Dateisystem zugreifen kann:
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      Relative Dateinamen wie <code class="literal">foo.txt</code>. Dies wird zu
      <code class="literal">aktuellesVerzeichnis/foo.txt</code> aufgelöst, wenn
      <code class="literal">aktuellesVerzeichnis</code> das gerade geöffnete Verzeichnis
      ist. Wenn also das aktuelle Verzeichnis <code class="literal">/home/foo</code>
      ist, so wird dies als <code class="literal">/home/foo/foo.txt</code> aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Relative Pfade wie <code class="literal">unterVerzeichnis/foo.txt</code>. Dies wird zu
      <code class="literal">aktuellesVerzeichnis/unterVerzeichnis/foo.txt</code> aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Absolute Pfadangaben wie <code class="literal">/main/foo.txt</code>. Dies wird zu
      <code class="literal">/main/foo.txt</code> aufgelöst.
     </span>
    </li>
   </ol>
   Das gleiche Prinzip kann auf Elemente mit Namespaces in PHP angewandt werden.
   Zum Beispiel kann eine Klasse auf drei Arten angesprochen werden:
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      Unqualifizierte Namen oder ein Klassenname ohne Präfix, wie etwa
      <code class="literal">$a = new foo();</code> oder
      <code class="literal">foo::staticmethod();</code>. Falls der aktuelle Namespace
      <code class="literal">aktuellerNamespace</code> ist, so wird dies zu
      <code class="literal">aktuellerNamespace\foo</code> aufgelöst.
      Ist der Code globaler Code ohne Namespaces, so wird dies zu
      <code class="literal">foo</code> aufgelöst.
     </span>
     <span class="simpara">
      Es gibt eine Ausnahme hierzu: Unqualifizierte Namen für Funktionen und
      Konstanten werden zu globalen Funktionen und Konstanten aufgelöst,
      wenn die Funktion oder Konstante im Namespace nicht definiert ist.
      Siehe auch <a href="language.namespaces.fallback.php" class="link">Namespaces verwenden:
      Rückgriff auf globale Funktion/Konstante</a> für weitere Details.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Qualifizierte Namen oder ein Klassenname mit Präfix, wie etwa
      <code class="literal">$a = new unterNamespace\foo();</code> oder
      <code class="literal">unterNamespace\foo::staticmethod();</code>.
      Wenn der aktuelle Namespace <code class="literal">aktuellerNamespace</code> ist, so
      wird dies als
      <code class="literal">aktuellerNamespace\unterNamespace\foo</code> verstanden.
      Wenn der Code global und ohne Namespaces ist, so wird dies zu
      <code class="literal">unterNamespace\foo</code> aufgelöst.
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      Vollständig qualifizierte Namen oder Namen mit globalem Präfixoperator wie
      <code class="literal">$a = new \aktuellerNamespace\foo();</code> oder
      <code class="literal">\aktuellerNamespace\foo::staticmethod();</code>.
      Dies wird immer wörtlich wie der im Code angegebene Name verstanden, also
      <code class="literal">aktuellerNamespace\foo</code>.
     </span>
    </li>
   </ol>
  </p>
  <p class="para">
   Hier ein Beispiel für die drei Schreibweisen in tatsächlichem Code:
   <div class="informalexample">
    <p class="simpara">file1.php</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">Foo\Bar\subnamespace</span><span style="color: #007700">;<br /><br />const </span><span style="color: #0000BB">FOO </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />function </span><span style="color: #0000BB">foo</span><span style="color: #007700">() {}<br />class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br />    static function </span><span style="color: #0000BB">staticmethod</span><span style="color: #007700">() {}<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <p class="simpara">file2.php</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">Foo\Bar</span><span style="color: #007700">;<br />include </span><span style="color: #DD0000">'file1.php'</span><span style="color: #007700">;<br /><br />const </span><span style="color: #0000BB">FOO </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br />function </span><span style="color: #0000BB">foo</span><span style="color: #007700">() {}<br />class </span><span style="color: #0000BB">foo<br /></span><span style="color: #007700">{<br />    static function </span><span style="color: #0000BB">staticmethod</span><span style="color: #007700">() {}<br />}<br /><br /></span><span style="color: #FF8000">/* Unqualifizierter Name */<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// wird als Funktion Foo\Bar\foo aufgelöst<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">::</span><span style="color: #0000BB">staticmethod</span><span style="color: #007700">(); </span><span style="color: #FF8000">// wird als Klasse Foo\Bar\foo und Methode staticmethod aufgelöst<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// gibt die Konstante Foo\Bar\FOO aus<br /><br />/* Qualifizierter Name */<br /></span><span style="color: #0000BB">subnamespace\foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// wird als Funktion Foo\Bar\subnamespace\foo aufgelöst<br /></span><span style="color: #0000BB">subnamespace\foo</span><span style="color: #007700">::</span><span style="color: #0000BB">staticmethod</span><span style="color: #007700">(); </span><span style="color: #FF8000">// wird als Klasse Foo\Bar\subnamespace\foo und<br />                                  // Methode staticmethod aufgelöst<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">subnamespace\FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// gibt die Konstante Foo\Bar\subnamespace\FOO aus<br /><br />/* Vollständig qualifizierter Name */<br /></span><span style="color: #0000BB">\Foo\Bar\foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// wird als Funktion Foo\Bar\foo aufgelöst<br /></span><span style="color: #0000BB">\Foo\Bar\foo</span><span style="color: #007700">::</span><span style="color: #0000BB">staticmethod</span><span style="color: #007700">(); </span><span style="color: #FF8000">// wird als Klasse Foo\Bar\foo und Methode staticmethod aufgelöst<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">\Foo\Bar\FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// gibt die Konstante Foo\Bar\FOO aus<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   Beachten Sie, dass für den Zugriff auf jede globale Klasse, Funktion oder
   Konstante9 auch ein vollständig qualifizierter Name verwendet werden kann,
   wie z. B. <span class="function"><a href="function.strlen.php" class="function">\strlen()</a></span>, <span class="classname"><a href="class.exception.php" class="classname">\Exception</a></span>
   oder \<strong><code><a href="info.constants.php#constant.ini-all">INI_ALL</a></code></strong>.
   <div class="example" id="example-1">
    <p><strong>Beispiel #1 Zugriff auf globale Klassen, Funktionen und Konstanten aus einem Namespace</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">Foo</span><span style="color: #007700">;<br /><br />function </span><span style="color: #0000BB">strlen</span><span style="color: #007700">() {}<br />const </span><span style="color: #0000BB">INI_ALL </span><span style="color: #007700">= </span><span style="color: #0000BB">3</span><span style="color: #007700">;<br />class </span><span style="color: #0000BB">Exception </span><span style="color: #007700">{}<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">\strlen</span><span style="color: #007700">(</span><span style="color: #DD0000">'hi'</span><span style="color: #007700">); </span><span style="color: #FF8000">// ruft die globale Funktion strlen auf<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">\INI_ALL</span><span style="color: #007700">; </span><span style="color: #FF8000">// greift auf die globale Konstante INI_ALL zu<br /></span><span style="color: #0000BB">$c </span><span style="color: #007700">= new </span><span style="color: #0000BB">\Exception</span><span style="color: #007700">(</span><span style="color: #DD0000">'error'</span><span style="color: #007700">); </span><span style="color: #FF8000">// erzeugt eine Neue Instanz der globalen<br />                              // Klasse Exception<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

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