Php/docs/language.namespaces.basics

提供:Dev Guides
< Php
移動先:案内検索

名前空間の使用法: 基本編

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

名前空間の使い方についてあれこれ言う前に、まずは PHP がどのようにしてコード中の要素の名前空間を知るのかを理解しておくことが重要です。 PHP の名前空間は、ファイルシステムにたとえて考えることができます。 たとえば、ファイルシステム内のファイルにアクセスするには次の 3 つの方法があります。

  1. foo.txt のような相対ファイル名を使う。これは currentdirectory/foo.txt と解釈されます。ここで、 currentdirectory は現在いるディレクトリを表します。したがって、カレントディレクトリが /home/foo であった場合はこれは /home/foo/foo.txt となります。
  2. subdirectory/foo.txt のような相対パス名を使う。これは currentdirectory/subdirectory/foo.txt と解釈されます。
  3. /main/foo.txt のような絶対パス名を使う。これは /main/foo.txt と解釈されます。

PHP の名前空間内の要素についても同じ理屈があてはまります。 たとえば、クラス名を参照するには次の 3 つの方法があります。

  1. $a = new foo(); あるいは foo::staticmethod(); のような非修飾名 あるいはプレフィックスなしのクラス名。 現在の名前空間が currentnamespace である場合、これは currentnamespace\foo と解釈されます。 名前空間に属さないグローバルなコードにおいては、これは foo と解釈されます。 注意: 修飾されていない関数や定数は、名前空間内にその関数や定数がなければ グローバルな関数あるいは変数とみなされます。詳細は 名前空間の使用法: グローバルな関数/定数への移行 を参照ください。
  2. $a = new subnamespace\foo(); あるいは subnamespace\foo::staticmethod(); のような修飾名 あるいはプレフィックスつきクラス名。 現在の名前空間が currentnamespace である場合、これは currentnamespace\subnamespace\foo と解釈されます。 名前空間に属さないグローバルなコードにおいては、これは subnamespace\foo と解釈されます。
  3. $a = new \currentnamespace\foo(); あるいは \currentnamespace\foo::staticmethod(); のような完全修飾名 あるいはグローバルプレフィックス演算子つきのクラス名。 これは、常にコードで記述されたとおりの名前である currentnamespace\foo と解釈されます。

これら 3 つの構文を実際のコードで使う例を次に示します。

file1.php

<?phpnamespace Foo\Bar\subnamespace;const FOO = 1;function foo() {}class foo{    static function staticmethod() {}}?>

file2.php

<?phpnamespace Foo\Bar;include 'file1.php';const FOO = 2;function foo() {}class foo{    static function staticmethod() {}}/* 非修飾名 */foo(); // Foo\Bar\foo 関数と解釈されますfoo::staticmethod(); // Foo\Bar\foo クラスの staticmethod メソッドと解釈されますecho FOO; // 定数 Foo\Bar\FOO と解釈されます/* 修飾名 */subnamespace\foo(); // Foo\Bar\subnamespace\foo 関数と解釈されますsubnamespace\foo::staticmethod(); // Foo\Bar\subnamespace\foo クラスの                                  // staticmethod メソッドと解釈されますecho subnamespace\FOO; // 定数 Foo\Bar\subnamespace\FOO と解釈されます                                  /* 完全修飾名 */\Foo\Bar\foo(); // Foo\Bar\foo 関数と解釈されます\Foo\Bar\foo::staticmethod(); // Foo\Bar\foo クラスの staticmethod メソッドと解釈されますecho \Foo\Bar\FOO; // 定数 Foo\Bar\FOO と解釈されます?>

グローバルなクラス、関数あるいは定数にアクセスするには、完全修飾名を使用して \strlen()\Exception あるいは \INI_ALL などとすることができます。

例1 グローバルなクラス、関数および定数への名前空間内からのアクセス

<?phpnamespace Foo;function strlen() {}const INI_ALL = 3;class Exception {}$a = \strlen('hi'); // グローバル関数 strlen をコールします$b = \INI_ALL; // グローバル定数 INI_ALL にアクセスします$c = new \Exception('error'); // グローバルクラス Exception のインスタンスを作成します?>