ホームページ  >  記事  >  バックエンド開発  >  PHP 名前空間

PHP 名前空間

巴扎黑
巴扎黑オリジナル
2016-11-11 09:57:411022ブラウズ

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

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

非常に長い識別子名 (通常、最初の種類の問題を軽減するために定義される) のエイリアス (または短い) 名を作成し、ソース コードの可読性を向上させます。

1. 名前空間を定義します

名前空間キーワードを使用して名前空間を定義し、区切り文字としてバックスラッシュ "" を使用します。

例:

namespace mytestspacex;

namespace mytest2spacexxxxx;

別の MyFullClassname を使用します。

3. PHP 名前空間の動的特性

use ディレクティブの後に変数または定数を使用することはできません。

クラスを呼び出す場合、クラス名とその前の名前空間は変数で構成できます。

namespace np1np2;

class Cls{

public static function test() {

print "test namespace 2n ";

}

}

namespace B ;

np1np2Cls::test();

//np1np2Cls::test(); //エラー、Bnp1np2Cls::test() の呼び出しです

$cls = "\np1\np2\Cls";

$cls::test();

$obj = new $cls();

$obj->test2();

4. 名前解決は次の規則に従います:

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

2. すべての非修飾名と修飾名 (非完全修飾名) は、現在のインポート ルールに従ってコンパイル時に変換されます。たとえば、名前空間 ABC が C としてインポートされた場合、CDe() の呼び出しは ABCDe() に変換されます。

3. 名前空間内では、インポート ルールに従って変換されないすべての修飾名の前に現在の名前空間名が付きます。たとえば、CDe() が名前空間 AB 内で呼び出された場合、CDe() は ABCDe() に変換されます。

4. 修飾されていないクラス名は、現在のインポート規則に従ってコンパイル時に変換されます (短いインポート名の代わりに完全な名前が使用されます)。たとえば、名前空間 ABC が C としてインポートされる場合、 new C() は new ABC() に変換されます。

5. 名前空間 (AB など) 内では、非修飾名への関数呼び出しは実行時に解決されます。たとえば、関数 foo() への呼び出しは次のように解析されます:

1) 現在の名前空間で ABfoo() という名前の関数を見つけます

2) グローバル空間で関数 foo() を見つけて呼び出してみます。

6. 名前空間 (AB など) 内の非修飾名または修飾名クラス (非完全修飾名) への呼び出しは実行時に解決されます。以下は、new C() と new DE() を呼び出す解析プロセスです。 new C() の解析:

1) 現在の名前空間で ABC クラスを見つけます。

2) クラス ABC を自動ロードしてみます。

new DE():

1) 現在の名前空間名をクラス名の前に追加して ABDE となり、クラスを検索します。

2) クラス ABDE を自動ロードしてみます。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。