<?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 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.namespaces.basics.php',
    1 => '基本編',
    2 => '名前空間の使用法: 基本編',
  ),
  'up' => 
  array (
    0 => 'language.namespaces.php',
    1 => '名前空間',
  ),
  'prev' => 
  array (
    0 => 'language.namespaces.definitionmultiple.php',
    1 => '同一ファイル内での複数の名前空間の定義',
  ),
  'next' => 
  array (
    0 => 'language.namespaces.dynamic.php',
    1 => '名前空間と動的言語機能',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    '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">名前空間の使用法: 基本編</h2>
  
  <p class="verinfo">(PHP 5 &gt;= 5.3.0, PHP 7, PHP 8)</p>
  <p class="para">
   名前空間の使い方についてあれこれ言う前に、まずは
   PHP がどのようにしてコード中の要素の名前空間を知るのかを理解しておくことが重要です。
   PHP の名前空間は、ファイルシステムにたとえて考えることができます。
   たとえば、ファイルシステム内のファイルにアクセスするには次の 3 つの方法があります。
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      <code class="literal">foo.txt</code> のような相対ファイル名を使う。これは
      <code class="literal">currentdirectory/foo.txt</code> と解釈されます。ここで、
      <code class="literal">currentdirectory</code> は現在いるディレクトリを表します。したがって、カレントディレクトリが
      <code class="literal">/home/foo</code> であった場合はこれは <code class="literal">/home/foo/foo.txt</code>
      となります。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">subdirectory/foo.txt</code> のような相対パス名を使う。これは
      <code class="literal">currentdirectory/subdirectory/foo.txt</code> と解釈されます。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">/main/foo.txt</code> のような絶対パス名を使う。これは
      <code class="literal">/main/foo.txt</code> と解釈されます。
     </span>
    </li>
   </ol>
   PHP の名前空間内の要素についても同じ理屈があてはまります。
   たとえば、クラス名を参照するには次の 3 つの方法があります。
   <ol type="1">
    <li class="listitem">
     <span class="simpara">
      <code class="literal">$a = new foo();</code> あるいは
      <code class="literal">foo::staticmethod();</code> のような非修飾名
      あるいはプレフィックスなしのクラス名。
      現在の名前空間が <code class="literal">currentnamespace</code> である場合、これは
      <code class="literal">currentnamespace\foo</code> と解釈されます。
      名前空間に属さないグローバルなコードにおいては、これは
      <code class="literal">foo</code> と解釈されます。
     </span>
     <span class="simpara">
      注意: 修飾されていない関数や定数は、名前空間内にその関数や定数がなければ
      グローバルな関数あるいは変数とみなされます。詳細は
      <a href="language.namespaces.fallback.php" class="link">名前空間の使用法:
      グローバルな関数/定数への移行</a> を参照ください。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">$a = new subnamespace\foo();</code> あるいは
      <code class="literal">subnamespace\foo::staticmethod();</code> のような修飾名
      あるいはプレフィックスつきクラス名。
      現在の名前空間が <code class="literal">currentnamespace</code> である場合、これは
      <code class="literal">currentnamespace\subnamespace\foo</code> と解釈されます。
      名前空間に属さないグローバルなコードにおいては、これは
      <code class="literal">subnamespace\foo</code> と解釈されます。
     </span>
    </li>
    <li class="listitem">
     <span class="simpara">
      <code class="literal">$a = new \currentnamespace\foo();</code> あるいは
      <code class="literal">\currentnamespace\foo::staticmethod();</code> のような完全修飾名
      あるいはグローバルプレフィックス演算子つきのクラス名。
      これは、常にコードで記述されたとおりの名前である
      <code class="literal">currentnamespace\foo</code> と解釈されます。
     </span>
    </li>
   </ol>
  </p>
  <p class="para">
   これら 3 つの構文を実際のコードで使う例を次に示します。
   <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">/* 非修飾名 */<br /></span><span style="color: #0000BB">foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Foo\Bar\foo 関数と解釈されます<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">// Foo\Bar\foo クラスの staticmethod メソッドと解釈されます<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// 定数 Foo\Bar\FOO と解釈されます<br /><br />/* 修飾名 */<br /></span><span style="color: #0000BB">subnamespace\foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Foo\Bar\subnamespace\foo 関数と解釈されます<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">// Foo\Bar\subnamespace\foo クラスの<br />                                  // staticmethod メソッドと解釈されます<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">subnamespace\FOO</span><span style="color: #007700">; </span><span style="color: #FF8000">// 定数 Foo\Bar\subnamespace\FOO と解釈されます<br />                                  <br />/* 完全修飾名 */<br /></span><span style="color: #0000BB">\Foo\Bar\foo</span><span style="color: #007700">(); </span><span style="color: #FF8000">// Foo\Bar\foo 関数と解釈されます<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">// Foo\Bar\foo クラスの staticmethod メソッドと解釈されます<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">// 定数 Foo\Bar\FOO と解釈されます<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   グローバルなクラス、関数あるいは定数にアクセスするには、完全修飾名を使用して
   <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> あるいは
   \<strong><code><a href="info.constants.php#constant.ini-all">INI_ALL</a></code></strong> などとすることができます。
   <div class="example" id="example-1">
    <p><strong>例1 グローバルなクラス、関数および定数への名前空間内からのアクセス</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">// グローバル関数 strlen をコールします<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">// グローバル定数 INI_ALL にアクセスします<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">// グローバルクラス Exception のインスタンスを作成します<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

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