深海のように深い『名前空間の話』 ② です。
名前空間の外に命令文は書けるのか?
試しに名前空間の外で ‘こんにちは’ を echo してみます。
<?php
namespace kani {
function getGreeting() {
return 'Hello';
}
}
echo 'こんにちは';
結果
Fatal error: No code may exist outside of namespace {}
Fatal error(致命的なエラー)No code may exist outside of namespaceは「名前空間の外にはコードが存在してはいけません」という意味です。このように、名前空間の外には命令文は書けません。
複数のファイルで同じ名前空間は使えるの?
複数のファイルで同じ名前空間は使えます。ここまで読んでくれている方はわかってくれると思いますが、同じ名前空間になるので、同名の関数などは定義できません。
サブ名前空間とは?
ディレクトリやファイルと同様、名前空間の階層構造を指定することができます。
名前空間\サブ名前空間\サブ名前空間
<?php
namespace japan\tokyo\kani;
function getGreeting() {
return 'おはよう';
}
名前空間に属する関数を利用するには、名前空間名も記述する必要があります。このときにサブ名前空間も忘れずに記述しましょう。
<?php
require_once 'kani.php';
echo japan\tokyo\kani\getgreeting();
結果 おはよう
サブ名前空間が使えることで実際のディレクトリ構造と同じ命名が可能になります。
名前空間の指定方法は3つ!
- 非修飾形式
- 修飾形式
- 完全修飾形式
非修飾形式
これは名前空間区切り文字を含まない識別子で、Foo のようなものです。ディレクトリ構造で言うところの同ディレクトリ内からの指定になります。
修飾形式
これは名前空間区切り文字を含む識別子で、Foo\Bar のようなものです。ディレクトリ構造で言うところのドキュメント相対パス。
完全修飾形式
これは名前空間区切り文字を含む識別子のうち先頭が名前空間区切り文字で始まるもので \Foo\Bar のようなものです。名前空間 \Foo も完全修飾名です。ディレクトリ構造で言うところのルート相対パス。
グローバル空間
名前空間の定義がない場合、すべてのクラスや関数の定義はグローバル空間に配置されます。名前空間に対応する前のPHPがサポートしていた空間です。名前の先頭にバックスラッシュをつけると、名前空間の内部からであってもグローバル空間の名前を指定することができます。
<?php
namespace A\B\C;
この関数は A\B\C\fopen です。
function fopen() {
$f = \fopen(...); グローバルな fopen をコールします。
return $f;
}
以上になります。次回はuseについて理解を深めていきたいと思います。