PHP名前空間とは何ですか?
一般的な名前空間とは何ですか?
例とレイマンの答えは素晴らしいでしょう。
Namespacingは、スコープが変数に対して行うのと同様に、関数およびクラスに対して行います。これにより、名前の衝突を引き起こすことなく、同じプログラムの異なる部分で同じ関数またはクラス名を使用できます。
簡単に言えば、名前空間を人の姓と考えます。 「John」という名前の人が2人いる場合は、姓を使用して区別できます。
output()
という名前の関数を使用するアプリケーションを作成するとします。 output()
関数は、ページ上のすべてのHTMLコードを取得してユーザーに送信します。
後でアプリケーションが大きくなり、新しい機能を追加する必要があります。 RSSフィードを生成できるライブラリを追加します。このライブラリは、output()
という名前の関数を使用して、最終フィードを出力します。
output()
を呼び出すと、PHPはoutput()
関数を使用するか、RSSライブラリのoutput()
関数を使用するかをどのようにして知るのでしょうか。そうではありません。 名前空間を使用していない場合.
2つのoutput()
関数をどのように解決しますか?シンプル。各output()
関数を独自の namespace に固定します。
これは次のようになります。
namespace MyProject;
function output() {
# Output HTML page
echo 'HTML!';
}
namespace RSSLibrary;
function output(){
# Output RSS feed
echo 'RSS!';
}
後でさまざまな機能を使用する場合は、次を使用します。
\MyProject\output();
\RSSLibrary\output();
または、名前空間の1つにいることを宣言し、その名前空間のoutput()
を呼び出すことができます。
namespace MyProject;
output(); # Output HTML page
\RSSLibrary\output();
名前空間がない場合は、ライブラリを追加するたびに(潜在的に)多くのコードを変更するか、関数名を一意にするための退屈なプレフィックスを作成する必要があります。名前空間を使用すると、サードパーティのコードと独自のプロジェクトを混在させるときに、名前の衝突の頭痛の種を回避できます。
名前空間を使用すると、名前の下に一連のコードを配置でき、クラス、関数、および定数と名前の競合が発生しません。
これにより、コードはその名前空間でliveになります。
PHPは やや物議を醸す文字\
を使用して名前空間レベルを表示します。エスケープキャラクターとしても使用されているため、人々は腕を組みました。
PHPで名前空間を使用するには、ファイルの先頭で次のようなものを使用します。
namespace my\namespace;
名前空間の公式PHPドキュメント でさらに多くの情報を見つけることができます。
他のプログラミング言語の名前空間(Javaのパッケージなど)のようなテクニックがあります。これらは、プロジェクト内で同じ名前の複数のクラスを使用できるようにするために使用されます。
Phpドキュメントから( http://www.php.net/manual/en/language.namespaces.rationale.php ):
名前空間とは何ですか?最も広い定義では、名前空間はアイテムをカプセル化する方法です。これは多くの場所で抽象的な概念として見ることができます。たとえば、オペレーティングシステムのディレクトリでは、関連するファイルをグループ化し、ファイル内のファイルのネームスペースとして機能します。具体例として、ファイルfoo.txtはディレクトリ/ home/gregと/ home/otherの両方に存在できますが、foo.txtの2つのコピーを同じディレクトリに共存させることはできません。さらに、/ home/gregディレクトリの外部でfoo.txtファイルにアクセスするには、ディレクトリセパレータを使用してファイル名の前にディレクトリ名を追加して/home/greg/foo.txtを取得する必要があります。この同じ原則は、プログラミングの世界の名前空間にも適用されます。
「名前空間」を知ることで「使用」というキーワードについて学ぶ方が簡単なので、最初に基本的なLaravelプロジェクトを見て、名前空間について説明しましょう。
次の名前のコントローラークラスがあります:Controller.phpこれはパスにあります:app/Http/Controllersプロジェクトのルートディレクトリから:Controller.phpという別のコントローラークラスもあります。 、しかしこれはパスにあります:vendor/laravel/framework/src/Illuminate/Routingプロジェクトのルートディレクトリから
あなたが混乱する可能性があるため、PHPを初めて使用する場合は、ソースコードをまだ見る必要はありませんが、代わりに私たちが気にしていることを説明します「名前空間」と「使用」を理解するのに役立ちます。
実際の問題として、最初のコントローラークラス:app/Http/Controllers/Controller.phpを使用する必要があります2番目のコントローラークラスvendor/laravel/framework/src/Illuminate/Routing/Controller.php実際に、いくつかの重要なルーティング機能を処理するためにコンテンツにアクセスするには、このクラスを拡張する必要があります。
では、クラスは同じ名前を持つ別のクラスをどのように拡張できますか?class Controller extends Controller
? これは動作しませんこれらの2つのクラスを区別するの方法がない限り、namespace
が便利であり、use
キーワードが完了するのに役立ちますの使命、使用を許可する; (クラス、メソッド、インターフェース、定数)、同じスコープ内の同じ名前。
では、コードでどのように行われますか?非常に簡単です!app/Http/Controllers/Controller.phpソースコード、クラスネームスペースの最上部で次のように宣言されていることがわかります:namespace App\Http\Controllers
クラスに名前空間を与えて、他のクラスから参照できるようにする方法です。これは、プロジェクトのルートディレクトリからこのクラスへのパスと同じに見えますが、ほとんど違いはなく、「\
」の代わりに「/
」(Windowsのコマンドプロンプトと同じ)、別の違いがあります。これは、パス名に小文字の「a」を含む名前空間と「app」。 また、名前空間では大文字と小文字が区別されることに注意してください。
したがって、名前空間はパスとは別の概念であり、役立つ場合はパス構造に従うことができますが、クラス、メソッド、インターフェイス、または定数への正確なパスである必要はありません例えば:vendor/laravel/framework/src/Illuminate/Routing/Controller.phpソースコード、
クラスの上部に名前空間が次のように宣言されています:Illuminate\Routing
次に、「use
」キーワードを見てみましょう。「use
」キーワードを使用して、クラスで使用する特定のクラスまたは関数をクラスに認識させます
したがって、インポートまたは何も含めません名前空間で参照することで特定のクラスまたはメソッドを使用することをクラスに知らせるだけですapp/Http/Controllers/Controller.phpソースコード、「use Illuminate\Routing\Controller as BaseController
」、「use
”キーワードの後にnamespaceが続きます(Illuminate\Routing\Controller.phpとIlluminate\Routing\Controller 'without .php extension'は交換可能です)
「as
」キーワードと「use
」キーワードを使用して、特定のクラス、メソッド、インターフェイス、または定数app/Http/Controllers/Controller.php拡張するIlluminate\Routing\Controller。 php BaseControllerとして:「class Controller extends BaseController
」行。
ディレクトリおよびファイルのように、PHPの名前空間はグループ化に役立ちますクラス、関数、 インターフェースおよび定数。
例:
Filesystem | PHP Namespace
----------------|------------------
/Dir/File.txt | \Namespace\Class
グローバル空間からアイテムをラップする方法を提供し、プログラムで名前の衝突を引き起こすことなく、プレーンなアイテム名を使用できるようにします。 PHP 5.3.0、PHP 7.でサポートされています。
ただし、PHP名前空間とUnixベースのファイルシステムとの類似点には、いくつかの制限があります。
| Filesystem | PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive | No | Yes
--------------------------|-----------------------|-------------------------
Name with plain number | Yes | No
--------------------------|-----------------------|-------------------------
Path level | Yes | Yes
--------------------------|-----------------------|-------------------------
Plain metacharacters name | Yes | No
この原則は、Wordのプログラミングにおける名前空間にまで及びます。
名前空間を使用すると、基本的にコンテナにコードを配置できます。これにより、同じ名前を共有する2つの関数(およびクラスと変数)の問題を防ぐことができます。
これらは、同じ名前を共有するコードの断片に関する問題を防ぐために、より大きなアプリケーションで作業するときに役立ちます。
たとえば、「TheMessage」という2つの関数が必要だとしましょう。これらは両方とも、それぞれ異なるメッセージを出力(エコー)します。同じ名前を共有する2つの関数を使用することはできないため、通常、これにより構文エラーが発生します。
これを修正するには、これらの関数を別々の名前空間に配置します。これにより、エラーなしで両方の機能を使用できます。
名前空間は、多くのものを単一のパックにパッケージ化するようなものです。名前空間を、鉛筆、定規、紙など、あらゆる種類のものを入れることができる引き出しとして想像してください。互いのアイテムを使用しないようにするには、誰に属するかが明確になるように引き出しにラベルを付けることにします。
名前空間はディレクトリのように機能します。親(または他の)ディレクトリのファイルと同じ名前のディレクトリにファイルを配置する方法を知っていますか?さて、名前空間を使用すると、変数、関数、およびクラスのアプリケーション内でそれを行うことができます。
PHPには、少し前に、静的関数の巨大なクラスの傾向が少しありました。これらの関数を呼び出す唯一の方法は、呼び出しの前にクラス名を付けることでした。これは名前空間での原始的な試みでしたが、あまり利点はありませんでした。
名前空間は、プログラム内の名前を制御する単純なシステムです。
名前が一意であり、競合が発生しないようにします。
名前空間は、コードのグループを囲むために使用され、名前の競合なしに異なる場所で使用できるようにします。これはjQueryの競合のない方法だと考えてください。そうすれば、よりよく理解できます。