大まかに言えば、名前空間は物事をカプセル化する方法です。この抽象的な概念はさまざまな場所で見られます。たとえば、ディレクトリはオペレーティング システムで関連ファイルをグループ化するために使用され、ディレクトリ内のファイルの名前空間として機能します。この原則をプログラミングの分野に適用すると、名前空間の概念になります
PHP では、名前空間は、クラス ライブラリやアプリケーションを作成するときにクラスや関数などの再利用可能なコードを作成するときに発生する 2 種類の問題を解決するために使用されます。1 つはユーザーが作成したコードと PHP の内部クラス/関数/定数間の名前の競合、または 3 つ目です。もう 1 つは、非常に長い識別子名 (通常、最初の種類の問題を軽減するために定義される) のエイリアス (または短い) 名を作成し、ソース コードの可読性を向上させることです。 PHP 名前空間は、関連するクラス、関数、定数をグループ化する方法を提供します。この記事ではPHPの名前空間について詳しく紹介します
合法的な PHP コードはすべて名前空間に含めることができますが、名前空間の影響を受けるのは次のタイプのコードのみです: クラス (抽象クラスと特性を含む)、インターフェイス、関数、定数です
名前空間はキーワード名前空間を通じて宣言されます。ファイルに名前空間が含まれている場合は、宣言キーワード
を除く他のすべてのコードの前に名前空間を宣言する必要があります。サブネームスペース
ディレクトリとファイルの関係と同じように、PHP 名前空間でも階層的な名前空間名を指定できます。したがって、名前空間名は階層的に定義できます
同じファイル内に複数の名前空間を定義できます。同じファイル内で複数の名前空間を定義するには 2 つの構文形式があります
実際のプログラミングの実践では、同じファイル内で複数の名前空間を定義することは強くお勧めできません。この方法は主に、複数の PHP スクリプトを同じファイルにマージするために使用されます
【1】簡単な組み合わせ構文(非推奨)
【2】中括弧の構文
全体
グローバル非名前空間のコードと名前空間のコードを組み合わせるには、中括弧の形式でのみ構文を使用できます。グローバル コードは、名前のない名前空間ステートメントを使用して中括弧で囲む必要があります
非修飾名とは、Foo
など、名前に名前空間区切り文字が含まれていない識別子を指します。修飾名 修飾名とは、FooBar
など、名前に名前空間区切り文字を含む識別子を指します。完全修飾名とは、FooBar のように、名前に名前空間区切り文字が含まれ、名前空間区切り文字で始まる識別子を指します。 namespaceFoo も完全修飾名です
要素(変数関数など)に動的にアクセスしたい場合は、完全修飾名を使用する必要があります
PHP は、現在の名前空間の内部要素にアクセスする 2 つの抽象メソッド、__NAMESPACE__ マジック定数と名前空間キーワードをサポートしています
定数 __NAMESPACE__ の値は、現在の名前空間の名前を含む文字列です。グローバル コードには、どの名前空間にも含まれず、空の文字列が含まれます
キーワード名前空間を使用すると、現在の名前空間またはサブ名前空間内の要素に明示的にアクセスできます。クラスのself演算子に相当します
名前空間が定義されていない場合、PHP が名前空間の概念を導入する前と同様に、すべてのクラスと関数はグローバル空間で定義されます。名前の前に付けると、名前が別の名前空間にある場合でも、その名前がグローバル空間にあることを示します
php允许通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。这有点类似于在类unix文件系统中可以创建对其它的文件或目录的符号连接
所有支持命名空间的PHP版本支持三种别名或导入方式:为类名称使用别名、为接口使用别名或为命名空间名称使用别名
在PHP中,别名是通过操作符 use 来实现的
别名
<?<span style="color: #000000;">php namespace hello\world\test; </span><span style="color: #0000ff;">use</span> hello\world\test <span style="color: #0000ff;">as</span> t;<span style="color: #008000;">//</span><span style="color: #008000;">用t来替代hello\world\test</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> demo(){ </span><span style="color: #0000ff;">echo</span> '111'<span style="color: #000000;">; } t\demo();</span><span style="color: #008000;">//</span><span style="color: #008000;">111</span> ?>
as可以省略
<?<span style="color: #000000;">php namespace hello\world\test; </span><span style="color: #0000ff;">use</span> hello\world\test;<span style="color: #008000;">//</span><span style="color: #008000;">用test来替代hello\world\test</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> demo(){ </span><span style="color: #0000ff;">echo</span> '111'<span style="color: #000000;">; } test\demo();</span><span style="color: #008000;">//</span><span style="color: #008000;">111</span> ?>
导入
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">use</span><span style="color: #000000;"> \ArrayObject; </span><span style="color: #800080;">$a</span> = <span style="color: #0000ff;">new</span> ArrayObject([]);<span style="color: #008000;">//</span><span style="color: #008000;">若不使用"use \ArrayObject" ,则实例化一个 foo\ArrayObject 对象</span> ?>
为了简化,一行中可以包含多个use语句
<?<span style="color: #000000;">php </span><span style="color: #0000ff;">use</span> My\Full\Classname <span style="color: #0000ff;">as</span> Another,<span style="color: #000000;"> My\Full\NSname; </span><span style="color: #800080;">$obj</span> = <span style="color: #0000ff;">new</span> Another; <span style="color: #008000;">//</span><span style="color: #008000;"> 实例化 My\Full\Classname 对象</span> NSname\subns\func(); <span style="color: #008000;">//</span><span style="color: #008000;"> 调用函数 My\Full\NSname\subns\func</span> ?>