【PHP入門】外部ファイルの読み込みとは(required, include)


■外部ファイルの読み込みについて

まずは以下のサンプルコードを見てみましょう。

<?php
echo "1回目<br>";
echo "Hello World!";
echo "<hr>";
echo "2回目<br>";
echo "Hello World!";
echo "<hr>";
echo "3回目<br>";
echo "Hello World!";

/* 出力結果
1回目
Hello World!
――――――――――――――――――
2回目
Hello World!
――――――――――――――――――
3回目
Hello World!
*/
?>

上記サンプルコードは極端な例ですが、
このように同じコード(「Hello World!」の出力)を同一ファイル内で複数箇所に記述したり、
複数ファイルにまたがって同じコードを記述することがあります。
(例:ヘッダーやフッターなど)

同じコードを何度書いても動作はするので一見問題はなさそうですが、
対象のコードを修正するとなった際、全ての箇所を書き換える必要が出てきてしまいます。
どれだけ慎重に修正してもすべての箇所を同様に修正できる保証はありませんし、
たとえ正しく全てを書き換えられたとしても時間がかかってしまったりと
複数箇所に同じコードを記述することにメリットは有りません。
また今回は1行なので問題にはなりませんが、数十行のコードを何度も書くのは
ソースコードの可読性が下がってしまう原因になってしまいます。

このような問題に対し、
PHPでは定数や関数の定義など、使い回しができるコードを分離して保存し、
色々なプログラムから外部ファイルとして読み込んで使用することができます。
ファイルに書かれている内容が、ただのHTMLならそのHTMLをブラウザに出力し、
PHPスクリプトならそのスクリプトを実行します。
外部ファイルを読み込む際には、主に以下の文が使用されます。

・require
・require_once
・include
・include_once

■外部ファイルを読み込む方法

最初のサンプルコードを require を使用して書き換えてみましょう。
同じコードは外部ファイル( external_file.php )として保存し、
その外部ファイルを指定した require によって繰り返し読み込んでいます。

<?php
echo "1回目<br>";
require("external_file.php"); // 外部ファイル external_file.php を読み込んでいる
echo "<hr>";
echo "2回目<br>";
require("external_file.php"); // 外部ファイル external_file.php を読み込んでいる
echo "<hr>";
echo "3回目<br>";
require("external_file.php"); // 外部ファイル external_file.php を読み込んでいる

/* 出力結果は先程のサンプルと同様です */
?>
 
 
// external_file.php
// このファイルが読み込まれる
<?php
echo "Hello World!";
?>

このように外部ファイルとして読み込むことによって、
外部ファイルを1つ修正すれば、読み込むすべての箇所に修正が適用され、
修正する時間も修正ミスをする可能性も減らすことができます。
上記コードは同一ファイル内で複数回読み込んでいますが、
もちろん他の複数ファイルからも読み込むことができます。

■require と include の違い

先程のサンプルでは require を使用しましたが、
includeで書き換えても同様に外部ファイルを読み込むことができます。

 
echo "1回目<br>";
include("external_file.php"); // 外部ファイル external_file.php を読み込んでいる
echo "<hr>";
echo "2回目<br>";
include("external_file.php"); // 外部ファイル external_file.php を読み込んでいる
echo "<hr>";
echo "3回目<br>";
include("external_file.php"); // 外部ファイル external_file.php を読み込んでいる

/* 出力結果は先程のサンプルと同様です */

このように require と include は機能的には同じですが、
指定したファイルが無い場合などのエラー時の処理が異なります。
require でエラーが発生した場合、致命的なエラー(Fatal Error)となり、その後の処理が停止してしまいます。
これに対して、include でエラーが発生した場合は、警告(Warning)を出力しますが、その後の処理は継続されます。

require と include を使い分けるおおまかな基準として、
読み込むことが必須となるファイルであったり、
その後の処理に影響を与える処理が書かれているファイルを読み込む場合は、
requireでファイルを読み込む事によって、
読み込めなかった場合に処理を停止させることができ、その後の後続処理を動かさずに済ませることが可能です。
対して、画像ファイルを読み込むなど、その処理が動作しなくても後続の処理に問題が発生しないファイルを読み込む場合は
includeでファイルを読み込むことによって、ファイルを読み込めなかった場合でも後続の処理を動作させることが可能です。

■once の有無による違い

require_once文 (include_once文) は、一度だけrequire (include) する文です。
ファイルがすでに読み込まれている場合は、再読み込みをしないという事です。
requireでファイルを読み込んだのサンプルと出力結果を見比べてみましょう。

<?php
echo "1回目<br>";
require_once("external_file.php"); // 外部ファイル external_file.php はまだ読み込まれていないので読み込む
echo "<hr>";
echo "2回目<br>";
require_once("external_file.php"); // 先程読み込まれたので、今回は読み込まれない
echo "<hr>";
echo "3回目<br>";
require_once("external_file.php"); // 先程読み込まれたので、今回は読み込まれない

/* 出力結果
1回目
Hello World!
――――――――――――――――――
2回目
――――――――――――――――――
3回目
*/
?>

上記の場合はエラーは発生しませんが、読み込むファイルの内容によっては
変数に値が再代入され上書きされてしまったり、関数の再定義などが起こることによって
エラーの原因となってしまうことがあります。(関数は再定義が不可能。)
このような問題が起こることを未然に防ぎたい場合に、
require_once文 (include_once文)を使って一度のみ読み込ませ、再度読み込ませないようにすることができます。

■まとめ

外部ファイルの読み込みについて、今までの話をまとめると以下の表のようになります。

  読み込み失敗時に処理を停止 読み込み失敗時も処理を継続
何度も読み込む require include
一度だけ読み込む require_once include_once

読み込む回数、読み込み失敗時の処理について、上記の表から状況に応じて適切なものを選び、使用しましょう。

  • このエントリーをはてなブックマークに追加

PAGE TOP