俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

PHPのincludeとrequireの違いと使いドコロ - 日報 #146

fluentdのno nodes are availableがなんかよく分からんタイミングで出現する時は、 ハートビートのためのUDPが(なんかしらんけど)ドロップするのが原因の1つみたいなので、
UDPでのハートビート用のデータを増やすか、
TCPでハートビートするよう設定する(hheartbeat_type tcp)か、
したほうがいいですぜ。
正攻法は後者だと思いますぜ。

さて、
飼ってるインコが春日和で発情し始めて困っていますが、
ボチボチいきましょう。
今日はすごく下らない話ですが、
誰ぞかのコードをレビューすることになったとき、
「includeとrequire」のどちらを使うべきかについて一瞬悩んだのでそれについて。

前にどっかで、 includeの読み込み方は「その場にコードを挿入する」ということなので、
例えばincludeされるファイルで/*のようなコメントアウトの開始があれば、
以下全てがコメントアウトされる、みたいな話を聞きましたが、
gccコンパイラがそもそも通らないので、これは一体何の話だったのだろうかという感じです。
脱線しましたが、
じゃぁPHPでのincludeとrequireの違いは何かというと、
公式の解説によれば、

include は、ファイルを見つけられない場合に warning を発行します。一方 require の場合は、同じ場合に fatal error を発行する点が異なります。

だそうです。
まぁつまるところ

require =「そのファイルがなきゃそのプログラム全体がFatalな状態だ!」
include =「そのファイルが無ければ警告は出すけど、プログラムは止めなくていいぜ」

の違いですね。
なんかincludeは差し込みで、requireはプログラム的なロードだ、
みたいな話をよく聞きますが、そんな違いはあんまないんじゃないでしょうか。
公式には上記の違いだけみたいですしおすし。
あと重要なのはこの一文ですね。

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

ということだそうです。
つまりfunctionやclass内でrequireやらincludeはできますが、
そこで読み込まれたfunctionはグローバルだとおっしゃっとるわけです。
まぁでもこれはclassのメソッド内部でfunctionを作った時も、
functionでfunctionを作った時も同じような動作なので、
まぁそうか、ってかんじです。

あ!眠い!じゃぁね!