Laravelを学んでいると名前空間という機能がよく使われています。 ”なんとなく…”理解していますが、その…”なんとなく”を解消するために、そして私の中の名前空間を埋めるため?に学習記録としてまとめます。名前空間とは項目をカプセル化(データとメソッドを一つのオブジェクトにまとめ、その内容を隠蔽することを言う)するもののことで、多くの場面でみられる抽象概念です。例えばたいていのOSはファイルをグループ化します。この場合、ディレクトリがその中の名前空間として機能しています。プログラミングの世界における名前空間もこの延長線上にあります。
この記事はこちらを参考にしています。とても分かりやすくいつも助けられています。感謝します。
PHPは同じ名前の関数は定義できない?
PHPでは同じ関数名は定義できません。
例 kani.phpとtoto.phpの2つのファイルで同名のgetGreeting()というあいさつを返してくれる関数を定義するとします。
<?php
function getGreeting() {
return 'ナマステ';
}
<?php
function getGreeting() {
return 'オラ';
}
call.phpから2つのファイルを読み込み、関数getGreetingを呼び出してみます。
<?php
require_once 'kani.php';
require_once 'toto.php';
echo getGreeting();
”ナマステ”や”オラ”の表示を期待しますが、Fatal error(致命的エラー)が発生します。
Fatal error : Cannot redeclare getGreeting()
declareは宣言という意味なので、再度宣言することはできません。という意味になります。
このように、同じ関数名を使うことはできません。別の関数名にすることで、解決出来ますが、定義する関数が増えると、名前の衝突を避けるために冗長な名前にしなければならなくなります。または複数人での開発の際にそれぞれのコードを読み込んだ際に衝突する可能性もあります。このような問題を名前空間が解決してくれます。
名前空間を定義する
名前空間とは名前の空間のことです。ここからここまでのコードが○○という空間に属していると定めることができます。空間が違えば同じ関数名も定義して使うことができます。名前空間を定義するには、namespaceキーワードの後に任意の空間名を記述します。namespaceは最初に記述します。namespaceより前に書くことが許されているのはdeclareのみです。ここまでは関数を例に説明してきましたが、名前空間を利用することで、名前の衝突を避けることが可能なのは、以下の4つです。
- 関数
- クラス(抽象クラスやトレイトを含む)
- インターフェース
- 定数(constで定義したもののみ)(define関数は影響しない)
名前空間を利用してみる
先ほどのFatal errorが出てしまったもので名前空間を利用してみましょう。
<?php
namespace kani;
function getGreeting() {
return 'ナマステ';
}
<?php
namespace toto;
function getGreeting() {
return 'オラ';
}
<?php
require_once 'kani.php';
require_once 'toto.php';
echo kani\getGreeting();
結果 ナマステ
名前空間名は任意で決められますので、ファイル名と関係のない名前空間名にすることも可能です。ただ、全く関係ないとわかりにくいので、わかりやすい名前空間名にすることを推奨しています。
to be continued…『名前空間の話 ② 』