プログラムにおいて、クラスや関数などの名前の衝突を防ぐために名前空間を使用して、それぞれグループ化することがあります。
PHPでは、namespaceやuseといったキーワードを使用して名前空間を使用します。
この記事では、
・namespaceとは?
・namespaceの基本的な使い方
・namespaceを{}(波カッコ)で囲む方法
・namespaceの注意点
・useとは?
・useの基本的な使い方
などの名前空間の使い方に関して解説していきます。
今回はそんな名前空間(namespace use)を使用する方法について、わかりやすく解説します!
namespaceとは
namespaceは名前空間とも呼ばれ、項目をカプセル化するときに使用します。
名前空間とは、例えば通常同じファイルに同じクラスや関数名、定数名が存在することはできませんが、名前空間を使用することにより、関連するクラスや、インターフェイス、関数、定数などをグループ化することが可能です。
そのため、名前空間を指定しておけば自分が作ったクラスが、サードパーティのクラスや関数などと名前が衝突することを防ぐことができます。
namespaceは以下のように記述します。
書き方:
namespace 名前空間名;
名前空間はソースコードの1番先頭で宣言する必要があります。
「クラス」「インターフェイス」「関数」「定数」が名前空間の影響を受けます。
また、namespaceの前にHTMLを記述するとエラーになりますので注意しましょう。
<!DOCTYPE html> <head> <meta charset="UTF-8"> <title>namespace_test</title> </head> <body> <?php namespace sample; ?> ・・・
このようにHTMLを記述するとエラーとなります。
namespaceの使い方
ここでは、namespaceを使用しないで別々のソースファイルから同名の関数を呼出したときにどうなるかを説明するとともに、名前空間を使用してどのように解決するかを見ていきましょう。
名前の衝突とは
namespaceを指定すれば、前述したように同一のファイルでクラスや関数などの名前の衝突を防ぐことができます。
例えば、以下のソースファイルsample1.phpに同じ名前の関数が存在し、sample2.phpから関数を呼び出そうとすると、エラーが発生します。
sample1.php
<?php function getName(){ return 'Samurai'; } function getName(){ return ‘Engineer'; } ?>
sample2.php
<?php //phpファイルを読み込む require_once 'sample1.php'; //関数の呼出し echo getName(); ?>
エラー:
PHP Fatal error: Cannot redeclare getName() (previously declared in ~
当然ながら関数getNameが既に存在するため、再宣言できない旨のエラーが発生しています。
名前空間を指定する
前項で同一ファイルで同じ関数名を指定しても、同名の関数が使用できないことがわかりました。
そこで同じ関数名を使用するためにはnamespaceを使用して、関数を明確に区別する必要があります。
以下にnamespaceを使用して、同一関数名を呼び出す方法を記述します。
sample1.php
<?php namespace name1; function getName(){ return 'Samurai'; } namespace name2; function getName(){ return 'Engineer'; } ?>
sample2.php
<?php //phpファイルを読み込む require_once 'sample1.php'; //関数の呼出し echo name1\getName(); echo name2\getName(); ?>
実行結果:
SamuraiEngineer
今回はしっかりと同一関数が呼び出せることがわかりましたね!
namespaceを宣言すると、その後に記述した関数はその名前空間の関数に属します。
サンプルではname1とname2を宣言して、その直後に関数を記述しているため、name1のgetName関数とname2のgetName関数でそれぞれ区別されることになります。
sample2.phpで関数を呼び出すときは、「名前空間\関数名」とすれば同一の関数を呼び出すことが可能となります。
{}(波カッコ)で囲む方法
名前空間は{}(波カッコ)で囲んで定義することもできます。
波カッコで囲む場合は、namespaceで指定したい範囲を囲む必要があります。
sample1.php
<?php namespace name1{ function getName(){ return 'Samurai'; } } namespace name2{ function getName(){ return 'Engineer'; } } ?>
sample2.php
<?php //phpファイルを読み込む require_once 'sample1.php'; //関数の呼出し echo name1\getName(); echo name2\getName(); ?>
実行結果:
SamuraiEngineer
波カッコを使用しても、先ほどのサンプルと同様に関数をそれぞれ呼び出せることがわかりますね!
名前空間は波カッコで囲んだほうがわかりやすいですが、なるべく1つのファイルには1つの名前空間にすることが推奨されています。
名前空間の注意点
名前空間は、範囲を波カッコで囲むと、名前空間の範囲の外で命令文を記述することができなくなります。
以下のサンプルではエラーが発生します。
名前空間の外で命令文を記述:
namespace name1{ function getName(){ return 'Samurai'; } } namespace name2{ function getName(){ return 'Engineer'; } } echo 'こんにちは!';
エラー:
PHP Fatal error: No code may exist outside of namespace {} in ~
{}(波カッコ)の外のコードが存在しない旨のエラーが発生しました。
そのため、namespaceを波カッコで指定するときには注意しましょう。
useとは
useとは名前空間の拡張機能で、外部のエイリアスやその一部を参照したり、クラス・関数・定数などをインポートするときに使用します。
useキーワードは、WindowsのショートカットやUnix系のシンボリックリンクを作成する機能に似ています。
useキーワードを使用して、エイリアスを定義するためには以下のように記述します。
書き方:
use [名前空間または一部・クラス・関数・定数など] as 別名称
useキーワードを使用すれば、名前空間などのフルパスを短縮して、別の名称で定義することが可能です。
useの使い方
以下にuseキーワードを使用して名前空間の一部を取得し、それぞれの名前空間の関数を呼び出す方法を記述します。
place.php
<?php namespace asia\japan\tokyo\shibuya; function getName(){ return 'shibuya'; } namespace asia\japan\tokyo\minato; function getName(){ return 'minato'; } namespace asia\japan\tokyo\shinagawa; function getName(){ return 'shinagawa'; } ?>
read.php
<?php //phpファイルを読み込む require_once 'place.php'; //名前空間をインポート use asia\japan\tokyo as name; //関数の呼出し echo name\shibuya\getName(); echo '<br>'; echo name\minato\getName(); echo '<br>'; echo name\shinagawa\getName(); ?>
実行結果:
shibuya minato shinagawa
サンプルではuseキーワードを使用して、place.phpの3つ名前空間の共通バスである「asia\japan\tokyo 」までをインポートして、名前空間を「name」の名称に指定しています。
nameからそれぞれのエリアの名称と関数をつなげれば、パスを短縮して同名の関数を呼び出すことができます。
まとめ
ここでは名前空間を定義するnamespaceの基本的な使い方から、名前空間やクラス、関数などをインポートするuseの使い方を解説しました。
ソースコードなどのファイルが多くなると、名前の衝突を防ぐために名前空間を使用することがありますので、この機会によく覚えておきましょう。
もし、名前空間の意味や使い方を忘れてしまったら、この記事を思い出してくださいね。