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が実行された 行の変数スコープを継承します。 呼び出し側の行で利用可能である全ての変数は、読み込まれたファイル内で利用可能です。 しかし、読み込まれたファイル内で定義されている関数やクラスはすべて グローバルスコープとなります。
ちょっと長くなってきましたので、今回はいったんここで切ります。 続きは明日公開しますので、どうぞお楽しみください。
それでは!!