1つのPHPファイルに処理をどんどん書いていくと見づらくなったり処理が複雑になったり・・・という経験はありませんか?
コードのみやすさ(可読性)も落ちるし、不具合のもとになる場合もあるし開発効率が悪くなっちゃいますよね?
PHPでは共通化できる処理を別のファイルに分解して、外部ファイルとして読み込むことができます。
たとえば、共通化したい内容を外部ファイルに記述することで、同じ処理を何度も記述する手間を省くことも可能です。
今回はinclude(include_once)を使うことでそういった問題を解決し、複数のファイルに処理を分けて書くことができるようになります!
この記事では、
・includeの基本的な使い方
・htmlファイルを読み込む方法
・変数や関数を共有する方法
・外部ファイルをループで読み込む方法
・外部ファイルを文字列として読み込む方法
・Warningメッセージを出力する
・include_onceの使い方
という基本的な内容から、
・includeとrequreの違いが知りたい
といった応用的な内容に関しても解説していきます。
今回はそんなinclude文で外部ファイルを読み込む方法について、わかりやすく解説します!
includeとは
外部ファイルを読み込むには、include文を使用します。
外部ファイルは主に共通で記述することが多いHTMLのヘッダー情報などを、1つのファイルに記述しておけば何度でも再利用が可能となります。
include文は指定されたファイルを読み込み、そのファイルに書いてある処理を実行します。
include文は以下のように記述します。
includeの書き方1(括弧なし):
include '外部ファイル名';
includeの書き方2(括弧あり):
include(‘外部ファイル名’);
外部ファイルの指定方法:
外部ファイル名はシングルクォーテーションのほか、ダブルクォーテーションや括弧で囲むこともできます。
外部ファイルが別のディレクトリにある場合は、元のファイルからの相対パスまたはサーバ上の絶対パスで指定します。
返り値:
include文を実行したときに、読み込んだファイル側でreturnで戻り値を返さなかった場合、1が返されます。
指定したファイルが存在しない場合はFALSEを返し、Warningのエラーを出力します。
includeの使い方
ここでは実際にinclude文の使い方を見ていきましょう。
基本的な使い方
以下の例では、include1.php から include2.php を読み込みます。
include1.php
<?php echo 'include1<br>'; include 'include2.php'; ?>
include2.php
<?php echo 'include2'; ?>
実行結果:
include1 include2
include1.php を実行すると、include1.php の「include ‘include2.php’;」で、
include2.php の処理が実行されているのがわかります。
ここではinclude2.phpでecho ‘include2’が実行されています。
また、includeの引数は以下のように絶対パスで指定することもできます。
<?php echo 'include1<br>'; include '/Applications/MAMP/htdocs/include/include/inc1/include2.php'; ?>
返り値を取得する方法
include文は前述したように読み込んだファイルでreturnで値を返さなかった場合は1を、ファイルが存在しないなど読み込みが失敗した場合はFALSEを返します。
そのため、include文の返り値を元に以下のように条件文で使用することもできます。
function foo($file){ return include $file; } //存在する $res = foo('include2.php'); if ($res == TRUE){ echo '読み込みOK<br>'; } else{ echo '読み込みNG<br>'; } //存在しない $res = foo('include3.php'); if ($res == TRUE){ echo '読み込みOK<br>'; } else{ echo '読み込みNG<br>'; }
実行結果:
読み込みOK 読み込みNG
htmlファイルを読み込む方法
include文はテキストファイルやHTMLファイルといった、PHPファイル以外の外部ファイルも読み込むことができます。
include1.php
<?php include 'include2.html'; ?>
include2.html
<!DOCTYPE html> <html> <head> <title>include2</title> </head> <body> <p>htmlファイルです。</p> </body> </html>
include1.php の実行結果:
htmlファイルです。
変数や関数を共有する
外部ファイルを使用して、変数や関数を共有することができます。
include1.php
<?php $val = 10; include 'include2.php'; ?>
include2.php
include1.phpの実行結果:
10
この例では、include1.phpで宣言した変数$valをinclude2.phpで表示しています。
外部ファイルをループで読み込む
以下のようにfor文の繰り返し処理で複数のファイルを読み込むことも可能です。
include1.php
<?php $count = 3; for($i = 1; $i <= $count; $i++){ include "test$i.php"; echo '<br>'; } ?>
test1~3.php
//test1.php <?php echo 'test1'; ?> //test2.php <?php echo 'test2'; ?> //test3.php <?php echo 'test3'; ?>
include1.phpの実行結果:
test1 test1 test3
外部ファイルを文字列として読み込む
出力バッファリングを使用して、includeで読み込んだPHPファイルを文字列として取得することもできます。
出力バッファを有効にするには、外部ファイルを読み込む前にob_start()を指定し、読み込んだあとはob_get_clean()でバッファの内容を取得後に削除します。
include1.php
<?php function get_include_contents($file) { //出力バッファリングを有効にする ob_start(); //外部ファイルの読み込み include $file; // バッファの内容を取得後に削除 return ob_get_clean(); } $text = get_include_contents('include2.php'); echo $text; ?>
include2.php
<?php echo 'include2'; ?>
実行結果:
include2
Warningメッセージを出力する
include文では外部ファイルが存在しなかった場合にWarningのメッセージを出力することができます。
ブラウザにエラーを出力するにはini_set関数に’display_errors’を指定します。
第二引数は(0:出力しない、1:出力する)となります。
ini_set('display_errors', 1); include "test.php";
実行結果:
Warning: include(test.php): failed to open stream: No such file or directory in /Applications/MAMP/htdocs/include_test/include1.php on line 4
include_onceの使い方
include_once文は、include文と同じく外部ファイルを読み込むときに使用しますが、違いとして外部ファイルがすでに読み込まれているか、チェックを行います。
すでに外部ファイルが読み込まれている場合は、ファイルを読み込むことはありません。
そのため、同じファイルを誤って複数回読み込みんだり、意図しない関数の再定義や値の初期化を防ぎたい場合に使用します。
include1.php
<?php include_once 'include2.php'; //1回目は正常に読み込む echo '<br>'; include_once 'include2.php'; //2回目は読み込まれない ?>
include2.php
<?php echo 'include2'; ?>
include1.phpの実行結果:
include2
requireとincludeの違い
require文とinclude文は、読み込むファイルが存在しなかった時の動きが異なります。
include文では警告が発生します。
<?php echo 'include start'; echo '<br>'; include 'nofile.txt'; echo '<br>'; echo 'include end'; ?>
実行結果 include start include end
ログファイルには、以下の警告が出力されます。
ログファイル Warning: include(): Failed opening 'nofile.txt' for inclusion (include_path='.;C:\php\pear') in C:\php\include1.php on line 4
警告が発生した後も処理は続行され、include後の処理が実行されています。
require文ではエラーが発生します。
<?php echo 'require start'; echo '<br>'; require 'nofile.txt'; echo '<br>'; echo 'require end'; ?>
実行結果 require start
ログファイルには、以下のエラーが出力されます。
ログファイル Fatal error: require(): Failed opening required 'nofile.txt' (include_path='.;C:\php\pear') in C:\php\require1.php on line 4
エラーが発生すると処理は中断され、require後の処理は実行されていません。
その後の処理に影響し、確実に読み込む必要がある場合はrequire文を、そうでない場合はinclude文を使うという使い分けができます。
require文については、以下の記事で詳しく解説しています!
速度面での比較
include文とrequire文に、速度面での違いはあるのでしょうか?
includeとrequireで、それぞれ1万回ループして外部ファイルの読み込みを行い、速度を秒単位で計測してみました。
<?php $count = 10000; // require $time_start = microtime(true); for ($i = 0; $i < $count; $i++) { require 'sum.php'; } $time = microtime(true) - $time_start; echo '<br>'; echo 'require:'. $time . ' seconds'; // include $time_start = microtime(true); for ($i = 0; $i < $count; $i++) { include 'sum.php'; } $time = microtime(true) - $time_start; echo '<br>'; echo 'include:'. $time . ' seconds'; echo '<br>'; ?>
実行結果 <1回目> require:2.0596947669983 seconds include:1.8765690326691 seconds <2回目> require:1.858304977417 seconds include:1.8033180236816 seconds <3回目> require:1.8084681034088 seconds include:1.7533450126648 seconds
include文の方が、処理速度が早いことがわかりました!
これは、require文が読み込むファイルが存在しなかった場合のエラーチェックをしているためと考えられます。
まとめ
今回は、外部ファイルを読み込む方法について、
- includeの基本的な使い方
- htmlファイルを読み込む方法
- 変数や関数を共有する
- 外部ファイルをループで読み込む
- 外部ファイルを文字列として読み込む
- Warningメッセージを出力する
- include_onceの使い方
- includeとrequreの違いが知りたい
などを解説しました。
大きなプログラムを書く時、この方法を知っていると処理を複数のファイルに分けて書くことができるので便利です。
外部ファイルを読み込む方法について忘れてしまったら、この記事を思い出して下さい!