めのん@ひとりプログラミング同好会

このブログはすべてフィクションであり、実在の人物、団体とは一切関係ありません

includeと名前空間

こんにちは、めのんです!

前回は関数から別のソースファイルをincludeした場合のスコープが、どうも公式ドキュメントの記述と食い違ってるんじゃないかという疑問についてお話ししました。 今回はその続きになります。

まずはソースコードを見ていただきましょうか。

f:id:elddiry:20200701124730p:plain

前回同様、a.phpからb.phpを読み込んでいます。 ただし、今回はb.php名前空間を使っています。

b.phpで定義したg関数は、公式ドキュメントの記述がもし正しいならグローバルスコープになるはずです。 「名前空間のスコープなのでグローバルスコープじゃないぞ!」というのは揚げ足取りみたいなのでここでは目をつむりましょう。

a.phpのコメントでも書いているように、f関数の中からなら

Test\g();

で呼び出すことができますが、f関数の外からではエラーになってしまいます。

素直に考えて、これは名前空間Testがf関数の関数内スコープにあるということだと思います。 じゃあ、関数内で名前空間を定義できるのかも? と思って次のようなコードを試してみました。

f:id:elddiry:20200701125502p:plain

結果はエラーでした。 普通に考えてそうですよね。

クラスや関数であれば、関数の中に入れ子にすることができるようなのですが、さすがに名前空間は無理でした。 ところがincludeした場合は、結果として関数内スコープに名前空間を定義できてしまうようです。

これってわかりにくい振る舞いですが、うまく使えば何かの役に立つかもしれません。 こういうのを追究するのは好きな方なので、今後も続きを書けたらいいなと考えています。

それでは!!