名前空間とは何ですか?


241

PHP名前空間とは何ですか?

名前空間とは何ですか?

例付きのレイマンの答えは素晴らしいでしょう。

回答:


573

名前空間は関数とクラスに対して、スコープが変数に対して行うことを行います。これにより、名前の衝突を引き起こすことなく、同じプログラムの異なる部分で同じ関数またはクラス名を使用できます。

簡単に言えば、名前空間は人の姓と考えてください。「ジョン」という名前の人が2人いる場合は、姓を使用して区別することができます。

シナリオ

という関数を使用するアプリケーションを作成するとしますoutput()。あなたのoutput()機能は、ページ上のHTMLコードのすべてを取り、それをユーザーに送信します。

後でアプリケーションが大きくなり、新しい機能を追加したいと考えています。RSSフィードを生成できるライブラリを追加します。このライブラリは、という名前の関数を使用してoutput()、最終フィードを出力します。

を呼び出すとoutput()、PHPはoutput()関数またはRSSライブラリのoutput()関数のどちらを使用するかをどのようにして知るのですか?そうではありません。 ない限り、あなたは、名前空間を使用しています。

2つのoutput()機能を持つことをどのように解決しますか?シンプル。各output()関数を独自の名前空間に貼り付けます

これは次のようになります。

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();

名前空間はありませんか?

名前空間がない場合、ライブラリを追加するたびに多くのコードを(場合によっては)変更するか、関数名を一意にするために面倒なプレフィックスを作成する必要があります。名前空間を使用すると、サードパーティのコードを独自のプロジェクトと混合するときに名前の衝突の頭痛を回避できます。


何らかの理由で、file1で名前空間を使用すれば、file2にファイルを含める必要がないか、または含める必要がないと思いました。単体テストでは、これは当てはまりません。
アーロンベル

1
@AaronBell オートローディングをチェックしたいかもしれません。
cbednarski

21

名前空間を使用すると、一連のコードを名前の下に配置でき、クラス、関数、および定数との名前の競合を防ぐことができます。

それはあなたのコードが生きることを可能にしますその名前空間に。

PHPはやや物議を醸す文字を使用しています \名前空間レベルを表示をます。エスケープキャラクターとしても使われているので、腕を組んで立ち上がりました。

PHPで名前空間を使用するには、ファイルの先頭で次のようなものを使用します。

namespace my\namespace;

名前空間の詳細については、PHP公式ドキュメントをご覧ください。


11

「名前空間」について知っておくと、「使用」というキーワードを学ぶ方が簡単なので、基本的なLaravelプロジェクトを見て、まず名前空間について説明しましょう。

名前のコントローラクラスがあります:Controller.phpパスである: アプリ/ HTTP /コントローラプロジェクトのルートディレクトリからは、という名前の別のコントローラクラスもあります:Controller.phpが、しかし、この1はパスである: ベンダー/ 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つのクラス区別する方法がなく、それが便利で、キーワードが使命を完了するのに役立ち、使用を許可しない限り、これは機能しません。(クラス、メソッド、インターフェース、定数)、同じ名前、同じスコープ内。namespaceuse

今それはコードでどのように行われますか?とてもシンプル!私たちが見ればアプリ/ HTTP /コントローラ/ Controller.phpのソースコードは、クラスの名前空間の上部に見ることができるように宣言されていますnamespace App\Http\Controllersので、これはそれが今、他のクラスによって参照できるように、あなたのクラスに名前空間を与える方法ですこれは、プロジェクトのルートディレクトリからこのクラスへのパスと同じように見えますが、違いはほとんどありません。これは、「\」の代わりに「/」を 使用することです(ウィンドウのコマンドプロンプトと同じ)。ただし、別の違いがあり、大文字のアプリです。ネームスペースの「A」とパスに小文字の「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」キーワードの後に名前空間 にターゲットクラスのが(Illuminate \ Routing \ Controller.phpとIlluminate \ Routing \ Controller '.php拡張子なし'は交換可能です)。

as」キーワードと一緒に「use」キーワードを使用して、特定のクラス、メソッド、インターフェース、または定数にエイリアス を与え、app / Http / Controllers / Controller.phpIlluminate \ Routing \ Controller.phpをBaseControllerとして拡張できるようにします。行:「class Controller extends BaseController」。


9

他のプログラミング言語の名前空間のようなテクニック(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を取得する必要があります。これと同じ原則が、プログラミングの世界の名前空間にも当てはまります。


1
Javaと比較するのは悪い考えです。Javaにはパッケージがあり、パッケージ可視性クラスがあります。保護されたメンバーの可視性は、それにアクセスするパッケージにも依存します。
Artefacto 2010

1
これらはパッケージとは異なりますが、同じ考え方を共有しています。
2ndkauboy 2010

質問では、一般的にどの名前空間が何であるかについても尋ねられるため、答えは理にかなっています。
kiamlaluno 2010

@kiam彼らは1つのアイデアを共有しています-衝突しないクラス名。彼らは可視性の考えを共有しません。
Artefacto 2010

@Artefacto:Kau-Boyは、両方の言語の名前空間が同じであるとは言いませんでした。
kiamlaluno 2010

4

ディレクトリファイルと同様に、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        

この原則は、プログラミング用語の名前空間にまで及びます。


3

名前空間はディレクトリのように機能します。親(または他の)ディレクトリ内のファイルと同じ名前のファイルをディレクトリに配置する方法を知っていますか?名前空間を使用すると、変数、関数、クラスのアプリケーション内で名前空間を作成できます。

少し前に、PHPには静的関数の巨大なクラスに関する傾向が少しありました。これらの関数を呼び出す唯一の方法は、クラス名を呼び出しの前に付けることでした。これは名前空間の原始的な試みでしたが、あまりメリットがありませんでした。


2

名前空間を使用すると、基本的にコードをコンテナに配置できます。これにより、同じ名前を共有する2つの関数(およびクラスと変数)の問題が回避されます。

これらは、同じ名前を共有するコードの断片に関する問題を防ぐために、より大きなアプリケーションで作業するときに役立ちます。

たとえば、 "TheMessage"という2つの関数が必要だとしましょう。これらは両方とも、それぞれ異なるメッセージを(エコー)印刷します。同じ名前を共有する2つの関数を持つことはできないため、通常、これは構文エラーの原因になります。

これを修正するには、これらの関数を個別の名前空間に配置します。これにより、エラーなしで両方の機能を使用できます。


2

名前空間は、多くのものを1つのパックにパッケージ化するようなものです。名前空間を、鉛筆、定規、紙など、あらゆるものを入れることができる引き出しとして想像してみてください。お互いのアイテムを使用しないようにするために、引き出しにラベルを付けて、だれが何に属しているかが明確になるようにします。


0

名前空間は、コードのグループを囲むために使用されるため、名前の競合なしでさまざまな場所で使用できます。これをjQueryの競合しないメソッドと考えると、理解が深まります。


「jQuery no conflict method」とはどういう意味ですか?それはPHPとどのように関連していますか?
Nico Haase

0

名前空間は、プログラム内の名前を制御する単純なシステムです。
これにより、名前が一意になり、競合が発生しなくなります。


どのような「名前」について話しているのですか?
Nico Haase

0

名前空間を使用して、作成するコードと内部のPHPクラス/関数/定数またはサードパーティのクラス/関数/定数の間の名前の衝突を回避できます。名前空間には、最初の問題を減らし、ソースコードの読みやすさを向上させるように設計されたExtra_Long_Namesをエイリアス(または短縮)する機能もあります。

誰もが知っているように、名前空間と特性はPHPの新機能ではありませんが、それでも多くのPHP開発者は、その複雑さのためにこれらの優れた概念を使用していません。したがって、この投稿では。例でそれらをクリアしてみます。名前空間と特性とは何ですか?

コードにそれらをどのように実装して、コードを再利用可能および拡張可能にすることができますか?

名前空間の利点

名前空間を使用して、作成するコードと内部のPHPクラス/関数/定数またはサードパーティのクラス/関数/定数の間の名前の衝突を回避できます。

名前空間には、最初の問題を減らし、ソースコードの読みやすさを向上させるように設計されたExtra_Long_Namesをエイリアス(または短縮)する機能もあります。例で名前空間を理解しましょう。htdocs(xampp)またはwww(xwamp)に「php_oops」という名前のフォルダーを作成します。「namespaces」という名前のルートディレクトリの下に新しいフォルダーを作成し、次に名前空間フォルダーの下にファイルindex.phpを作成します。

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

参照 -https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
別のサイトにある自分のコンテンツにリンクする場合は注意してください。スパマーになりたくはありません。ここにコンテンツの大部分を含める必要があり、リンクは参照としてのみ使用してください。
ダーマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.