回答:
名前空間は関数とクラスに対して、スコープが変数に対して行うことを行います。これにより、名前の衝突を引き起こすことなく、同じプログラムの異なる部分で同じ関数またはクラス名を使用できます。
簡単に言えば、名前空間は人の姓と考えてください。「ジョン」という名前の人が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();
名前空間がない場合、ライブラリを追加するたびに多くのコードを(場合によっては)変更するか、関数名を一意にするために面倒なプレフィックスを作成する必要があります。名前空間を使用すると、サードパーティのコードを独自のプロジェクトと混合するときに名前の衝突の頭痛を回避できます。
「名前空間」について知っておくと、「使用」というキーワードを学ぶ方が簡単なので、基本的な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つのクラス
を区別する方法がなく、それが便利で、キーワードが使命を完了するのに役立ち、使用を許可しない限り、これは機能しません。(クラス、メソッド、インターフェース、定数)、同じ名前、同じスコープ内。namespace
use
今それはコードでどのように行われますか?とてもシンプル!私たちが見ればアプリ/ 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.phpがIlluminate \ Routing \ Controller.phpをBaseControllerとして拡張できるようにします。行:「class Controller extends BaseController
」。
他のプログラミング言語の名前空間のようなテクニック(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を取得する必要があります。これと同じ原則が、プログラミングの世界の名前空間にも当てはまります。
ディレクトリやファイルと同様に、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
この原則は、プログラミング用語の名前空間にまで及びます。
名前空間を使用すると、基本的にコードをコンテナに配置できます。これにより、同じ名前を共有する2つの関数(およびクラスと変数)の問題が回避されます。
これらは、同じ名前を共有するコードの断片に関する問題を防ぐために、より大きなアプリケーションで作業するときに役立ちます。
たとえば、 "TheMessage"という2つの関数が必要だとしましょう。これらは両方とも、それぞれ異なるメッセージを(エコー)印刷します。同じ名前を共有する2つの関数を持つことはできないため、通常、これは構文エラーの原因になります。
これを修正するには、これらの関数を個別の名前空間に配置します。これにより、エラーなしで両方の機能を使用できます。
名前空間は、コードのグループを囲むために使用されるため、名前の競合なしでさまざまな場所で使用できます。これをjQueryの競合しないメソッドと考えると、理解が深まります。
名前空間を使用して、作成するコードと内部の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