Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. PHP入門編 - include()とrequire()の違い

include()とrequire()の違い

この記事を書いているのは夏真っ盛りな時期なんですが、なんだか今日は寒いです。デスクワークを2x年続けてると気温の変化についていけず困ったもんでございます。

というわけでみなさまどうも。

前回は『変数』について色々とやりましたね。ちょっと地味な記事が続いているので今回はちょいとPHPの強力さとか便利さを紹介したいと思います。

その名も『インクルード処理』でございます。これ超便利です。ちなみにこれは正式な名前じゃないです。私が勝手に呼んでるだけです。

(´-`).。oO(とはいうものの、『インクルード処理』といえば大体伝わる気がします...)

インクルード』(include)とは直訳すると「含める、入れる」って意味になり、プログラミングにおいての『インクルード』は『他のファイルに記述した内容を取り込む』という感じの意味になります。これは正式な言葉です。違ってたらすみません。

さて、当記事をお読みの方は「HTMLならバリバリ書けるぜ!」という設定のもと進めているので少しHTMLを振り返ってみたいと思います。

基本的なHTMLは以下のような感じですよね。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="keywords" content="">
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- ここにコンテンツだよー -->

</body>
</html>

んでもってHTMLにはhead要素ってありますよね。その上のdoctype宣言なんかもそうです。あの記述って大体同じ感じになるかと思います。以下の部分になります。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="keywords" content="">
<link rel="stylesheet" href="style.css">
</head>

HTMLファイルだけで構成した場合、例えばCSSのファイルの場所を変更するとなると全HTMLファイルの記述を変更しなくてはなりません。何百万ファイルあったらもう大変です。一括置換とかすればいんですが、一括置換はミスすると怖いのでなるべく避けたいところでもあります。

しかし、PHPで構成した動的ウェブサイトならば『include()』とかを使うことでパーツ分けしたHTMLファイルとかを取り込んで出力できるようになります。ちょっとその処理を構築してみましょう。

まず『header.php』って名前でファイルをひとつ作ります。この名前は何でも大丈夫ですが、head要素とか記述する場合は『header.php』って名前を付けるのが一般的な気がします。そしてこのファイルにdoctype宣言とかhead要素あたりの記述を書き込みます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="keywords" content="">
<link rel="stylesheet" href="style.css">
</head>

そしたら保存してしまってください。

次に同じフォルダ(ディレクトリ)に『index.php』というファイルを作成します。これがメインのphpファイルになりますね。トップページに表示させたいならば名前は『index.php』にしておくと良いです。ディレクトリの場所はどこでも構いませんが、同じ場所に置いておくと分かりやすいです。その『index.php』に残りのHTMLソースを記述します。

<body>
<!-- ここにコンテンツだよー -->

</body>
</html>

そして『index.php』の頭に『include('./header.php');』と記述してあげます。以下のような感じですね。

<?php
include('./header.php');
?>
<body>
<!-- ここにコンテンツだよー -->

</body>
</html>

さて、この状態で『index.php』にアクセスするとあら不思議。以下のテキストファイルが返ってきます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="keywords" content="">
<link rel="stylesheet" href="style.css">
</head><body>
<!-- ここにコンテンツだよー -->

</body>
</html>

最初のHTMLファイルとほぼ同じ状態のソースコードがちゃんと返ってきていますね。『インクルード処理』を組み込むとこんな感じになります。これでCSSファイルの場所とかを変更することになっても『header.php』をちょろっと直すだけで全てのページに修正を反映することができます。いかがでしょうか。かなり使い勝手が良さそうな感じがしてもらえれば嬉しいです。

では改めてPHPの『インクルード処理』のさせ方を確認していきましょう。ちょっとややこしいのですがPHPでの『インクルード処理』を行える関数は『include()』、『require()』、『include_once()』、『require_once()』の計4種類が存在しています。しかも微妙に処理が違っていたりするのでちょっと確認していきましょう。

(´-`).。oO(PHPは類似関数の数がかなり多めですのでご注意を...)

基本的な文法としては『()』の中にファイルの場所を文字列で指定してあげるだけでOKです。『.php』じゃなくて『.txt』とかも問題なく読み込んでくれます。例えば『./header.php』を読み込ませる場合は以下のような感じになりますね。

<?
include('./header.php');
require('./header.php');
include_once('./header.php');
require_once('./header.php');

さて、それぞれの関数の違いになりますが、『include()』と『require()』ではファイルの読み込みに失敗した場合の処理に違いがあります。『include()』の場合はファイルの読み込みに失敗しても『include()』の処理部分だけ中止してその先に続く記述は何事もなかったかのように処理を走らせます。

逆に『require()』ではファイルの読み込みに失敗した場合はその場ですぐエラーとなり、その先の記述を含めて処理が停止されます。

ちょっと確認してみましょう。存在しないファイル『./test.php』を『include()』で読み込ませてみます。

<?php
include('./test.php');

echo 'test!';

こうすると以下のようなテキストが返って来ます。(php.iniの設定でエラー出力を『On』にしている場合)

Warning: include(./test.php): failed to open stream: No such file or directory in /Users/xxxx/Desktop/test/index.php on line 2

Warning: include(): Failed opening './test.php' for inclusion (include_path='.:/Applications/MAMP/bin/php/php5.6.7/lib/php') in /Users/xxxx/Desktop/test/index.php on line 2
test!

このようにエラーがでてはいるものの、最後にちゃんと『test!』が出力されていますね。

ではこれを『require()』に変更するとこうなります。

<?php
require('./test.php');

echo 'test!';

Warning: require(./test.php): failed to open stream: No such file or directory in /Users/xxxx/Desktop/test/index.php on line 2

Fatal error: require(): Failed opening required './test.php' (include_path='.:/Applications/MAMP/bin/php/php5.6.7/lib/php') in /Users/xxxx/Desktop/test/index.php on line 2

『include()』と違い、『test!』という文字列が出力されていません。このような感じで続く記述も含めて処理が中断にされてしまうのが『require()』になりますね。

この動きを考えてみると、柔軟な『include()』の方が使い勝手が良い気がするかと思います。しかし、重要な処理が記述してあるPHPファイルなどは必ず読み込ませる必要があったりしますので、読み込みに失敗した時点で処理を停止してくれる『require()』の方がミスに気づきやすかったりします。

なので読み込みに失敗しても大した問題にならない、通常のHTMLファイルやテキストを読み込ますときは『include()』、確実に読み込ませなくてはならない重要な関数などの処理が書かれたPHPファイルなどを読み込ますときは『require()』、といった使い分けをしている方が多いです。どっちか迷ったら読み込ませたいファイルが重要なのか、それとも重要じゃないか、で考えてみると良いかもしれません。

(´-`).。oO(まあ、読み込ませるファイル指定の記述を間違えなければいいだけの話だったりするんですけどね...)

そしてあと2つの関数、『include_once()』、『require_once()』についてです。『include_once()』は同じファイルが指定された場合は一度しか処理しない『include()』、『require_once()』は同じファイルが指定された場合は一度しか処理しない『require()』、といった感じになります。

ちょっと実験してみましょう。先ほどと同じ『header.php』を『index.php』で『include()』で2回出力させてみます。

<?php
include('./header.php'); // 2回取り込んで出力させます。
include('./header.php');
?>
<body>
<!-- ここにコンテンツだよー -->

</body>
</html>

すると以下のテキストファイルが返ってきます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="keywords" content="">
<link rel="stylesheet" href="style.css">
</head><!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="keywords" content="">
<link rel="stylesheet" href="style.css">
</head><body>
<!-- ここにコンテンツだよー -->

</body>
</html>

『header.php』が二回読み込まれて出力されていますね。これを『include_once()』に書き換えてみます。

<?php
include_once('./header.php'); // 2回取り込んで出力させようとしています。
include_once('./header.php');
?>
<body>
<!-- ここにコンテンツだよー -->

</body>
</html>

すると以下のテキストファイルが返ってきます。

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title></title>
<meta name="description" content="">
<meta name="keywords" content="">
<link rel="stylesheet" href="style.css">
</head><body>
<!-- ここにコンテンツだよー -->

</body>
</html>

『include_once()』が2つ記述されているにも関わらず『header.php』が一度しか読み込まれて出力されていませんね。『require_once()』でも同じ結果になります。これが『include_once()』と『require_once()』の挙動になります。

ちょっとややこしい感じで混乱しがちなのでPHPでの『インクルード処理』についてまとめてみましょう。

まずあまり重要でないファイル(ただのHTMLソースコードだったり、ちょっとした文言が記述されている感じのファイルとか)では『include()』を使用すると良いです。『include_once()』を使用してしまうと、その取り込んだファイルを一度しか出力(処理)できなくなってしまうために修正するのに一手間かかってしまう場合があります。

例えば、新着情報が書かれている『whatsnew.txt』を取り込んで『include_once()』を使ってページ上部に出力させていたのですが「この新着情報はページの下部にも出力させたいなぁ」という気分になった場合、これまでの処理を『include()』に書きなおさなければ下部に『whatsnew.txt』を出力させることはできません。何百ページと存在していたらその修正はかなり手間になってしまいますよね。なので『include_once()』は使用する機会はほとんどない、と考えて良いです。

そしてPHPやJavaScriptなどの関数定義や処理が書かれた必ず読み込ませないといけない重要なファイルでは読み込みに失敗したらすぐに気付ける『require_once()』を使用すると良いでしょう。

「『require()』じゃないの?」となるかもしれませんが、まず関数定義などの処理群が記述されたファイルは何度も読み込ませる必要がないことが多いです。同じ関数とかを何回も再定義するのも変な話ですからね。そういう処理群が書かれたファイルを間違えて複数読み込ませると処理を上書きしてしまったりしてしまったりしてちゃんと動かなくなってしまう結果になりがちです。

特にウェブサイトの構築にあたってJavaScriptファイルの取り込み間違いは要注意です。JavaScriptはブラウザで実行させる言語なので、ウェブサイトを表示させているだけで変数や関数などで保持している値がコロコロ変わる感じになります。

間違えてJavaScriptファイルを複数回読み込ませて動かなくなってしまった場合、JavaScriptが苦手なサーバー系のプログラマーさんとかだとどこのミスなのか特定するのにかなり時間がかかってしまう場合があります。『require_once()』ならば1度しか読み込まれないので間違えて書いてしまっても動かなくなる事態には発展することは稀です。

(´-`).。oO(「間違えなければ良いだけの話だろぉ」ってなるかもしれませんが...)

(´-`).。oO(大規模なウェブサイトやブラウザゲームの開発になるとファイルがパーツ化されていてバラバラになっているので...)

(´-`).。oO(ファイルすべてを把握しきれず間違えて同じ処理を何度も書いてしまう場合が多々あるのでございます...)

というわけで超まとめです。単純なファイル読み込みで使用するのは『include()』、重要なファイル読み込みで使用するのは『require_once()』

以上でございます。

ちょっと記事が長くなってしまってすみません。シンプルなウェブサイトを構築する場合でも『インクルード処理』は中々便利だと思います。当サイトでも『インクルード処理』はバリバリ組み込んであります。「この辺のデザインちょっと変えたいなぁ」なんてなった場合でも一箇所直すだけで済んだりするのでメンテナンスがとっても楽ちんでございます。

というわけでここまでお疲れ様でした。次の記事では『演算子』とかを使って色々と遊んでみましょう。ではではこの辺で。またお会いしましょう。

この記事は桜舞が執筆致しました。

著者が愛する小型哺乳類

桜舞 春人 Sakurama Haruto

ISDN時代から様々なコンテンツを制作しているちょっと髪の毛が心配な東京在住のプログラマー。生粋のロングスリーパーで、10時間以上睡眠を取らないと基本的に体調が悪い。好きなだけ寝れる生活を送るのが夢。ゲームとスポーツと音楽が大好き。誰か髪の毛を分けて下さい。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。