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

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

includeとスコープ 第1回

こんばんは、めのんです!

今夜もPHPの話題です。 何と言っても私はPHP猛勉強中ですから!

今回の話題はincludeです。 Cにも#includeという前処理指令がありますから、きっと似たようなものなんだろうな、と思っていました。

私がどんな風に予想していたかをお伝えするために、ちょっと横道にそれますがCの#includeについても触れておきます。

Cの#includeには次の2つの形態があります。

#include <ヘッダー名>
#include "ソースファイル名"

どちらもソースコードを取り込むためのものですが、<>で囲む形式は「ヘッダー」を取り込みます。 ヘッダーというのは処理系が提供するライブラリの機能で、必ずしもファイルとして実装されているわけではありません(私が知る限り、どの処理系もファイルとして実装していますけどねw)。 もし、指定したヘッダーが見つからなければ後者の形式と同様に解釈されます。

もうひとつの形式である二重引用符に囲む形式はソースファイルを取り込みます。 ソースファイルなのでCのソースコードであればどんなファイルでも取り込むことができます。

Cのインクルードは、ソースコードの内容をそのままその場所に埋め込むだけのものです。 私は最初、PHPのincludeもその程度のものだろうと思っていたのです。

ところが実際には全然違いました。 もしかするとPHPのバージョンによって事情が異なるかもしれませんので、私が使っているPHPのバージョンが7.4.7であることをお断りしておきます。

PHPのincludeには4種類あります。 include, include_once, require, require_onceがそうですが、今回はそれらの差異については割愛します。 以下、すべてincludeと書きますが、4種類のどれにも当てはまるとお考えください。

私が一番驚いたのはスコープの扱いについてです。 公式ドキュメントには次のように記述されています。

ファイルが読み込まれるとそのファイルに含まれるコードは、 includeもしくはrequireが実行された 行の変数スコープを継承します。 呼び出し側の行で利用可能である全ての変数は、読み込まれたファイル内で利用可能です。 しかし、読み込まれたファイル内で定義されている関数やクラスはすべて グローバルスコープとなります。

ちょっと長くなってきましたので、今回はいったんここで切ります。 続きは明日公開しますので、どうぞお楽しみください。

それでは!!