PHPの「require」と「include」等の読み込み構文の違いについての覚書です。
PHPにおいて、ファイルを読み込む言語構造には、次の4つがあります。
・ require
・ require_once
・ include
・ include_once
上記の4つは、似た動作をしますが、微妙に挙動が異なります。
結論から言うと、ベターなのは、「require_once」です。
以下、それぞれ検討していきます。
まず、これらの言語構造は、2つの観点から区別できます。
一つ目は、エラー処理の仕方。
二つ目は、ファイルの再読込の可否。
■ エラー処理の仕方について
require系の二つと、include系の二つは、エラー処理の仕方が異なります。
例えば、存在しないファイルを指定したとき、次のエラーとなります。
・ require系・・・fatal error (実行が止まる)
・ include系・・・warning error (実行は継続される)
fatal error は、エラー時点で実行が止まります。これに対して、warning error では、実行が続いてしまいます。
基本的には、エラーが生じた時点で処理を止めることが、バグの発生を防止します。
ですから、この観点からいうと、require系の方がファイルの読み込みに適していると言えます。
■ ファイルの再読込の可否
上記4つの構文には、_onceが付くものがあります。付かないものとの違いは、特定のファイルを二度以上読み込めるかということです。
_onceが付いている構文の場合、同じファイルを二度以上読み込んでも、実際には最初の一度だけ読み込むことができます。
これに対して、onceが付かない構文の場合には、同じファイルの複数回の読み込みが可能となります。もっとも、同じ関数やクラスを二度以上読み込むと再定義できない旨のfatal errorとなります。
通常、ファイルの読み込みは一度だけ行えば足りるので、once系の構文が使われる傾向にあります。
■ 結論
結果として、requre_once 構文がベターということになります。
■ まとめ
・ require ・・・・・・・・・ fatal error、複数読込可能(但し、fatal error)
・ require_once ・・・ fatal error、複数読込無視
・ include ・・・ ・・・・・・warning error、複数読込可能(但し、fatal error)
・ include_once ・・・ warning error、複数読込無視
以上です。