サーチ…
備考
名前空間とは何ですか?もっとも広い定義では、名前空間はアイテムをカプセル化する方法です。これは多くの場所で抽象的な概念として見ることができます。たとえば、オペレーティングシステムのディレクトリでは、関連するファイルをグループ化し、それらのファイルの名前空間として機能します。具体的な例として、ファイルfoo.txtは/ home / gregディレクトリと/ home / otherディレクトリに存在しますが、foo.txtの2つのコピーは同じディレクトリに共存できません。さらに、/ home / gregディレクトリ以外のfoo.txtファイルにアクセスするには、/home/greg/foo.txtを取得するためにディレクトリ区切り文字を使用してファイル名にディレクトリ名を追加する必要があります。これと同じ原理がプログラミング世界の名前空間にも及んでいます。
最上位レベルの名前空間のことに注意してくださいPHP
とphp
PHP言語自体のために予約されています。カスタムコードでは使用しないでください。
名前空間の宣言
名前空間の宣言は次のようになります。
-
namespace MyProject;
- 名前空間MyProject
宣言する -
namespace MyProject\Security\Cryptography;
ネストされた名前空間を宣言する -
namespace MyProject { ... }
- ブラケットを含む名前空間を宣言します。
単一のファイルで好きなだけ多く宣言することができますが、ファイルごとに単一の名前空間を宣言することをお勧めします。
namespace First {
class A { ... }; // Define class A in the namespace First.
}
namespace Second {
class B { ... }; // Define class B in the namespace Second.
}
namespace {
class C { ... }; // Define class C in the root namespace.
}
名前空間を宣言するたびに、それを定義したクラスはその名前空間に属します:
namespace MyProject\Shapes;
class Rectangle { ... }
class Square { ... }
class Circle { ... }
名前空間宣言は、異なるファイルで複数回使用できます。上記の例では、 MyProject\Shapes
名前空間の3つのクラスを1つのファイルに定義しています。これは3つのファイルに分割されることが好ましく、各ファイルはnamespace MyProject\Shapes;
始まりnamespace MyProject\Shapes;
。これについては、PSR-4標準の例で詳しく説明します。
名前空間内のクラスまたは関数の参照
Declaring Namespacesに示すように、名前空間内のクラスを次のように定義することができます。
namespace MyProject\Shapes;
class Rectangle { ... }
このクラスを参照するには、完全なパス(名前空間を含む)を使用する必要があります。
$rectangle = new MyProject\Shapes\Rectangle();
これは、 use
-statementでクラスをインポートすることで短縮できます。
// Rectangle becomes an alias to MyProject\Shapes\Rectangle
use MyProject\Shapes\Rectangle;
$rectangle = new Rectangle();
PHP 7.0では、括弧を使用して、単一の文でさまざまなuse
-statementをグループuse
できます。
use MyProject\Shapes\{
Rectangle, //Same as `use MyProject\Shapes\Rectangle`
Circle, //Same as `use MyProject\Shapes\Circle`
Triangle, //Same as `use MyProject\Shapes\Triangle`
Polygon\FiveSides, //You can also import sub-namespaces
Polygon\SixSides //In a grouped `use`-statement
};
$rectangle = new Rectangle();
時には、2つのクラスが同じ名前を持つこともあります。異なる名前空間にある場合、これは問題ではありませんが、 use
-statementをuse
してそれらをインポートしようとすると問題になる可能性がありuse
。
use MyProject\Shapes\Oval;
use MyProject\Languages\Oval; // Apparantly Oval is also a language!
// Error!
これは、 as
キーワードを使用してエイリアスの名前を自分で定義することで解決できます。
use MyProject\Shapes\Oval as OvalShape;
use MyProject\Languages\Oval as OvalLanguage;
現在の名前空間外のクラスを参照するには、 \
でエスケープする必要があります。それ以外の場合は、現在の名前空間から相対名前空間パスが引き継がれます。
namespace MyProject\Shapes;
// References MyProject\Shapes\Rectangle. Correct!
$a = new Rectangle();
// References MyProject\Shapes\Rectangle. Correct, but unneeded!
$a = new \MyProject\Shapes\Rectangle();
// References MyProject\Shapes\MyProject\Shapes\Rectangle. Incorrect!
$a = new MyProject\Shapes\Rectangle();
// Referencing StdClass from within a namespace requires a \ prefix
// since it is not defined in a namespace, meaning it is global.
// References StdClass. Correct!
$a = new \StdClass();
// References MyProject\Shapes\StdClass. Incorrect!
$a = new StdClass();
名前空間とは何ですか?
PHPコミュニティには多くの開発者がたくさんのコードを作成しています。つまり、あるライブラリのPHPコードで別のライブラリと同じクラス名を使用する可能性があります。両方のライブラリが同じ名前空間で使用されると、それらは衝突し、問題を引き起こします。
名前空間はこの問題を解決します。 PHPのリファレンスマニュアルで説明されているように、名前空間は、名前空間ファイルであるオペレーティングシステムディレクトリと比較することができます。同じ名前の2つのファイルが別々のディレクトリに共存することがあります。同様に、同じ名前の2つのPHPクラスが別々のPHP名前空間に共存することがあります。
他のライブラリとの衝突を心配せずに他の開発者が使用できるように、コードの名前空間を設定することが重要です。
サブネームスペースの宣言
次の例のように、階層を使用して単一の名前空間を宣言します。
namespace MyProject\Sub\Level;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
上記の例は、以下を作成します。
定数 MyProject\Sub\Level\CONNECT_OK
クラス MyProject\Sub\Level\Connection
および
関数 MyProject\Sub\Level\connect