ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向プログラミング (oop) 学習メモ (5) - PHP namespace_PHP チュートリアル

PHP オブジェクト指向プログラミング (oop) 学習メモ (5) - PHP namespace_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:28:30843ブラウズ

名前空間の概要

PHP では、クラス ライブラリやアプリケーションを作成するときにクラスや関数などの再利用可能なコードを作成するときに発生する 2 種類の問題を解決するために名前空間が使用されます。

ユーザーが作成したコードと、PHP の内部クラス/関数/定数またはサードパーティのクラス/関数/定数の間で名前が競合します。

非常に長い識別子名 (通常、最初の種類の問題を軽減するために定義される) のエイリアス (または短い) 名を作成し、ソース コードの可読性を向上させます。
PHP 名前空間は、関連するクラス、関数、定数をグループ化する方法を提供します。以下は、PHP 名前空間構文を示す例です:

名前空間を定義する

任意の合法的な PHP コードを名前空間に含めることができますが、名前空間の影響を受けるコードはクラス、関数、定数の 3 種類のみです。名前空間は、キーワード namespace を使用して宣言されます。ファイルに名前空間が含まれている場合は、他のすべてのコードの前に名前空間を宣言する必要があります。さらに、PHP の他の言語機能とは異なり、同じ名前空間を複数のファイルで定義できるため、同じ名前空間の内容を別のファイルに分割して保存できます。もちろん、同じファイル内に複数の名前空間を定義することもできます。

コードをコピーします コードは次のとおりです:
namespace MyProject;
class MyClass
{
#code...
}

サブ名前空間を定義する: ディレクトリとファイルの関係と同様に、PHP 名前空間でも階層的な名前空間名を指定できます。したがって、名前空間名は階層的に定義できます。

コードをコピーします コードは次のとおりです:
namespace MyProjecthelperhttp;
class MyClass
{
#code...
}

同じファイル内で複数の名前空間を定義する: 同じファイル内で複数の名前空間を宣言するには 2 つの方法がありますが、実際のプログラミングの実践では、同じファイル内で Dogo 名前空間を定義することは強くお勧めできません。この方法は主に、同じファイル内の複数の PHP スクリプトを結合するために使用されます。最初の方法を以下に示します。

コードをコピーします コードは次のとおりです:
namespace MyProjecthelperhttp;
class MyClass
{
#code...
}
namespace MyProjecthelperrequest;
class MyClass
{
#code...


ただし、この方法の使用は強く推奨されません。次のブレース定義方法を参照してください。

コードをコピーします コードは次のとおりです:
namespace MyProjecthelperhttp;
{
MyClass
クラスMyClass
{
.
}
}

PHP 名前空間での要素の使用

名前空間の使用方法について説明する前に、PHP がどの名前空間要素を使用するかをどのように認識するかを理解する必要があります。クラス名は 3 つの方法で参照できます:

修飾されていない名前、またはプレフィックスのないクラス名 ($a=new foo(); または foo::staticmethod(); など)。現在の名前空間が currentnamespace の場合、foo は currentnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、どの名前空間にもコードが含まれていない場合、foo は foo として解決されます。 警告: ネームスペース内の関数または定数が未定義の場合、修飾されていない関数または定数名はグローバル関数または定数名に解決されます。詳細については、「名前空間の使用: フォールバック グローバル関数名/定数名」を参照してください。

修飾名、またはプレフィックスを含む名前 ($a = new subnamespacefoo(); または subnamespacefoo::staticmethod(); など)。現在の名前空間が currentnamespace の場合、foo は currentnamespacesubnamespacefoo に解決されます。 foo を使用するコードがグローバルであり、コードがどの名前空間にも含まれていない場合、foo はサブ名前空間 foo に解決されます。

完全修飾名、またはグローバル接頭辞演算子を含む名前 ($a = new currentnamespacefoo() または currentnamespacefoo::staticmethod(); など)。この場合、foo はコード内で常にリテラル名 currentnamespacefoo に解決されます。
名前空間を使用: alias/import

エイリアスを介して外部完全修飾名を参照またはインポートできるようにすることは、名前空間の重要な機能です。 PHP 名前空間のサポート エイリアスまたはインポートを使用するには、クラス名にエイリアスを使用する方法と、名前空間名にエイリアスを使用する方法の 2 つがあります。 PHP では、エイリアスは演算子を使用して実装されます。

PHP はインポートされた関数や定数をサポートしていないことに注意してください。

コードをコピーします コードは次のとおりです:

namespace foo;
use MyFullClassname as Another;

// 次の例は、NSname として MyFullNSname を使用するのと同じです
use MyFullNSname;

//グローバルクラスをインポートします
ArrayObjectを使用します;

名前解決ルール

名前解決ルールを説明する前に、いくつかの重要な定義を見てみましょう:

非修飾名: 名前に名前空間区切り文字を含まない識別子 (Foo など)
修飾名: 名前に名前空間区切り文字を含む識別子 (FooBar など)。 FooBar などの名前空間区切り文字を含み、名前空間区切り文字で始まるもの。 namespaceFoo も完全修飾名です。
名前解決は次のルールに従います:

関数、クラス、定数の完全修飾名への呼び出しはコンパイル時に解決されます。たとえば、新しい AB はクラス AB に解決されます。

すべての非修飾名と修飾名 (完全修飾名ではない) は、現在のインポート ルールに従ってコンパイル時に変換されます。たとえば、名前空間 ABC が C としてインポートされる場合、CDe() の呼び出しは ABCDe() に変換されます。
名前空間内で、インポート ルールに従って変換されないすべての修飾名には、現在の名前空間名が先頭に付加されます。たとえば、CDe() が名前空間 AB 内で呼び出された場合、CDe() は ABCDe() に変換されます。
修飾されていないクラス名は、現在のインポート ルールに従ってコンパイル時に変換されます (短いインポート名の代わりに完全な名前が使用されます)。たとえば、名前空間 ABC が C としてインポートされる場合、 new C() は new ABC() に変換されます。
名前空間 (AB など) 内では、修飾されていない名前への関数呼び出しは実行時に解決されます。たとえば、関数 foo() への呼び出しは次のように解析されます:
1) 現在の名前空間で ABfoo() という名前の関数を見つけます。
2) グローバル空間で関数 foo() を見つけて呼び出してみます。
名前空間 (AB など) 内の非修飾名または修飾名クラス (非完全修飾名) への呼び出しは実行時に解決されます。以下は、new C() と new DE() を呼び出す解析プロセスです: new C() の解析:
現在の名前空間で ABC クラスを見つけます。
クラス ABC の自動ロードを試してください。

新しい DE() 分析:

クラス名の前に現在の名前空間名を追加して、ABDE となり、クラスを検索します。
クラスABDEの自動ロードを試してください。

グローバル名前空間内のグローバル クラスを参照するには、完全修飾名 new C() を使用する必要があります。

名前解決の例

コードをコピーします コードは次のとおりです:

namespace A;
use BD, CE as F;
// Function call
foo(); // まず、名前空間 "A" で定義された関数 foo() を呼び出してみます。グローバル関数 "foo" を呼び出す
foo(); // グローバル関数 "foo" を呼び出す
myfoo(); // 名前空間 "Amy" で定義された関数 "foo" を呼び出す
F();まず関数 "f" を呼び出します
// "A" の関数空間 "a" で、グローバル関数 "f" を呼び出してみます
// クラス参照
new b () // で定義されたクラスを作成します名前空間 "a" B "B" B "B" B "B" "One object 如果 // 見つからない場合は、クラスを自動的にロードしてみます" AB "
New D (); // インポート ルールを使用して作成しますネーミングスペース「D」に定義された「d」のオブジェクト
// 見つからない場合は、クラス「BD」を自動的にロードしようとします
new F() // インポートルールを使用して、定義されたクラス「E」のオブジェクトを作成しますin namespace "C"
// 見つからない場合は、自動ロードを試みます Load the "CE" wNew b () // "B" のグローバル空間に定義されたオブジェクトを作成します
// 見つからない場合は、自動ロードを試みますクラス "B"
New D (); // グローバル空間で定義されたクラス "D" のオブジェクトを作成します
// 見つからない場合は、クラス "D" を自動的にロードします
new F(); //グローバル空間で定義されたクラス "F" のオブジェクトを作成します Object
// 見つからない場合は、クラス "F" を自動的にロードしようとします
// 別の名前空間の静的メソッドまたは名前空間関数を呼び出します
Bfoo(); //名前空間 "AB" の関数 "foo" を呼び出します (B :: FOO (); // 名前空間 "a" で定義された "B" の "FOO" メソッドを呼び出します
// クラス "AB" の場合が見つからない場合は、自動ロード クラス "AB" を試してください
d: : foo () // インポート ルールを使用し、名前空間 "D" で定義された "d" の "d" メソッドを呼び出します
//クラス「BD」が見つかりません。クラス「BD」を自動的にロードしてみてください
BFOO () // 名前空間「B」の関数「foo」を呼び出します
B::foo(); // 「foo」を呼び出しますグローバル空間内のクラス "B" のメソッド
見つかった場合は、クラス "B" を自動的にロードしようとします
// 現在の名前空間内の静的メソッドまたは関数
AB::foo() // "foo" メソッドを呼び出します名前空間 "AA" で定義されたクラス "B" A // クラス "AAB" が見つからない場合は、クラス "AAB" の自動読み込みを試みます
AB :: FOO () // で定義された "B" メソッドを呼び出します。名前 "AB" "FOO" メソッド
// クラス "AB" が見つからない場合は、クラス "AB" を自動ロードしてみます
?>





http://www.bkjia.com/PHPjc/788610.htmlwww.bkjia.com

tru​​ehttp://www.bkjia.com/PHPjc/788610.html技術記事名前空間の概要 PHP では、名前空間は、クラス ライブラリやアプリケーションを作成するときにクラスや関数などの再利用可能なコードを作成するときに発生する 2 種類の問題、つまりユーザー作成のコードと P... を解決するために使用されます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。