PHPでrequire, require_onceを使いファイルを読み込む

実用的なWebアプリケーションを作成するためには、ライブラリの活用が欠かせません。また、同じプログラムであっても、機能別にファイルを分割しておくことはその後の開発を容易にします。

PHPでライブラリや他のPHPファイルを読み込み利用するにはincludeかrequireを使いますが、今回はrequireとrequire_onceについて説明します。

includeの説明とrequireとincludeの違いは、それぞれ以下を参照してください。

参照:PHPでinclude, include_onceを使いファイルを読み込む
参照:PHPのinclude文とrequire文の違い

require文の使い方

require "ファイルパス";
require("ファイルパス");

requireは上記のように2通りの書き方ができます。書き方による違いはないので、どちらの書き方でも大丈夫です。 ファイルパスは、「絶対パス」で指定する以外に、現在のディレクトリからの相対位置で指定する「相対パス」で指定することができます。また、読み込むファイルの拡張子は.phpでなくても構いません。 requireで他のPHPファイルを読み込みます。

参照:絶対パスと相対パスの違い

サンプルコード(sample1.php)

require './sample2.php';
sample2func();

次のコードはsample2.phpというファイル名で、sample1.phpと同じディレクトリに保存してください。

サンプルコード(sample2.php)

function sample2func(){
    echo 'sample2func';
}

実行結果

sample2func

試しにrequireをコメントアウトしてみましょう。それ以外は前のコードと同一です。

サンプルコード(sample1.php)

// require './sample2.php';
sample2func();

実行結果

Fatal error: Call to undefined function sample2func() in sample1.php on line 4

PHPファイルが読み込まれなくなり、そこに書かれているsample2func関数が見つからないというエラーになりました。

require_once文の使い方

require_once "ファイルパス";
require_once("ファイルパス");

require_once文は、require文と同じように使うことができます。require文との違いは、ファイルがすでに読み込まれている場合は再読み込みをしないという点です。

ライブラリや設定ファイルなどが意図せずに2回requireされると、関数の再定義エラーや変数の書き換えなどが起こってしまいます。これをrequire_onceでは避けることができます。

絶対パスと相対パスどちらがいいのか

基本的に、相対パスは避けたほうが良いでしょう。相対パスの場合は、意図しないファイルを読み込んでしまう可能性があります。

ファイルを多重で読み込む場合

require文の相対パスは、PHPファイルを実行したディレクトリの位置からの相対パスとなります。

そのため、require文で読み込んだ先でさらにrequire文でファイルを読み込むという場合に、意図しないファイルを読み込むという不具合につながる可能性があります。

絶対パスのベタ書きはNG

ただし、絶対パスで指定する場合は、ファイルを移動した時などに困るので、dirname(__FILE__)などを使うようにしましょう。

サンプルコード

require dirname(__FILE__) . '/sample.php';

または、ディレクトリのパスを定数で設定しておくなどして、なるべくディレクトリの変更などに作用されないプログラムとなるようにしましょう。


イベント