こんにちは!エンジニアのオータケです。
PHPのプログラムから外部ファイルを読み込むには、require文やinclude文を使用します。
外部ファイルは、主に共通した処理を記述したファイルをプログラム間で使用するときによく使われます。
本記事では特に、なぜrequireを使うのかも含めて解説をしていますのでぜひご覧ください。
この記事では
[基本] requireの基本的な使い方
[基本] require_onceやincludeとは何か
[実践] includeとの違いは何か
を解説していきます。
外部ファイルを用意しておくとプログラムやHTMLなどのテンプレートを再利用するときに非常に便利です。
ここではそんな外部ファイルを読み込むrequire文の使い方について分かりやすく解説いたします。
requireとは?
requireはどんな機能?
外部ファイルを読み込むには、require文を使用します。
外部ファイルを読み込むとは、
「別ファイルに書かれた処理をを実行する」
と思っていただいても良いでしょう。
例えば、外部ファイルにPHPのプログラムの記述があれば、require文で読み込んだときにそのプログラムが実行されます。
requireの書き方
require文は以下のように記述します。
require "ファイル名";
ファイル名はシングルクォーテーションのほか、ダブルクォーテーションで囲むこともできます。
また読み込むファイルパス(ファイル名を含むファイルの場所)は絶対パスから記述できますし、現在の場所を基準とした相対パスももちろん指定できます。
ファイルの指定はPHPプログラムの実行場所と同じディレクトリに存在する場合は、相対パスを指定します。
しかし、実行するファイルのディレクトリが異なる場合は、「/home/user/tmp/test.txt」のように絶対パスを指定します。
返り値
require文を実行したときに、読み込んだファイル側でreturnで戻り値を返さなかった場合に1が返されます。
外部ファイルが存在しなかった場合は、Fatal errorが発生します。
requireはどこで使うの?
外部ファイルを読み込む機能をなぜ使う必要があるのでしょうか?
またこのrequireはなぜ存在しているのでしょうか?
例えば、あなたがWebアプリケーションを作ろうとして1つのファイルにすべての処理を書くとします。
その処理が数十行や数百行といった範囲ならばいいのですが、数千、数万行を詰め込んだ場合いくつか問題が起きます。
たとえば、数万行のコードに処理を追加しなければならない時や処理を書き換えないといけない時、「どこに処理を入れるべきか」、「どこの場所に修正を加えないといけないか」などを考え把握するのに少々面倒臭さを覚えます。
それだけでなく1ファイルにすべての処理を記入するとなると数ヶ月後、数年後に自分でメンテナンスしようとした際に可読性(プログラムの読みやすさ)が落ちるため見ただけで絶望することにもなります。
また、これはとても重要なことですが1つのファイルにすべての処理を詰め込んでしまった場合、別のWebアプリケーション開発時に機能の使い回しができないということにもなります。
これはどういうことでしょうか?
次の図を見てください。
この図はECサイトを作ろうとした場合の図です。
まず、ユーザーはindex.phpへアクセスします。
1つのファイルの場合はindex.phpだけで処理を終えることになりますが、requireを使うことで機能ごとにファイルを分けることができます。
たとえば、user.phpは会員登録や会員情報を取得するための関数(もしくはクラス)を書く場所。
item.phpは商品情報の取得や商品の購入処理を行うための関数(もしくはクラス)を書く場所。
buy.phpは商品を購入する際のフォーム画面や商品購入完了画面の表示の処理を書く場所・・・・
と、機能や処理をファイルごとにわけることができるようになります。
このような書き方をすれば処理を変更する場合でも数万行のコードの山から処理を探す必要もなくなったり、一部の機能だけ別のWebアプリケーションで再利用することも可能になります。
requireの使い方
ここでは実際にrequire文の使い方を見ていきましょう。
以下の例では、require1.php から require2.php を読み込みます。
<?php echo 'require1<br>'; require 'require2.php'; ?>
<?php echo 'require2'; ?>
require1 require2
このサンプルではrequire1.phpでrequire文を使用して、
「require ‘require2.php’;」の記述でrequire2.phpを読み込んでいます。
require2.phpでは「echo ‘require2’;」と記述しているため、require2が出力されます。
また、以下のように外部ファイルに変数が定義してある場合は、その変数を参照することもできます。
<?php $fruit1 = 'apple'; $fruit2 = 'orange'; ?>
<?php echo '$fruit1:'.$fruit1.'<br>'; echo '$fruit2:'.$fruit2.'<br>'; require 'require1.php'; echo '$fruit1:'.$fruit1.'<br>'; echo '$fruit2:'.$fruit2.'<br>'; ?>
$fruit1: $fruit2: $fruit1:apple $fruit2:orange
htmlファイルを読み込む方法
外部ファイルはPHPのファイル以外にもテキストファイルやHTMLファイルを読み込むこともできます。
たとえば、HTMLファイルのヘッダやメタ情報などを外部ファイルとして記述しておけば、PHPのプログラムで繰り返し利用することができます。
<?php require 'temp.html'; ?>
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>require test</title> </head> <body> <h1>requireテスト</h1> <p>これはhtmlファイルです。</p> </body> </html>
requireではファイルが存在しないとエラーが発生する?
require文では外部ファイルが存在しなかった場合にE_COMPILE_ERRORレベルの致命的なエラー(Fatal error)が発生します。
ブラウザにエラーを出力するにはini_set関数に‘display_errors’を指定します。
ini_setの第二引数は(0:出力しない、1:出力する)となります。
ini_set('display_errors', 1); require "test.php"; //読み込み失敗するとこの処理まで到達しない。 echo 'test.phpの読み込み後';
requireに似た機能
require_once
require_once文は、require文と同じく外部ファイルを読み込むときに使用しますが、違いとして外部ファイルがすでに読み込まれているかチェックを行います。
そのため、同じファイルを誤って読み込んで関数の再定義や変数の再代入を防ぎたいときに、require_onceを使用します。
書き方は基本的にrequireと同じです。
では次の例で使い方を見てみましょう。
<?php $fruit1 = 'apple'; $fruit2 = 'orange'; ?>
<?php //読み込み1回目 require_once "require1.php"; echo '$fruit1:'.$fruit1.'<br>'; echo '$fruit2:'.$fruit2.'<br>'; $fruit1 = 'melon'; //読み込み2回目 require_once "require1.php"; //2回目は読み込まれないので$fruit = melon echo '$fruit1:'.$fruit1.'<br>'; echo '$fruit2:'.$fruit2.'<br>'; ?>
$fruit1:apple $fruit2:orange $fruit1:melon $fruit2:orange
実行結果のとおり、require_onceは同じファイルを2回読み込まないため、$fruit1は変更した値を保持したままとなります。
そのため、誤って変数の再代入や初期化を防ぎたいときはrequire_onceを使用すると良いでしょう。
include
requireには他にも似たような命令があり、includeといいます。
使い方はrequireと同じような使い方をします。
以下の例では、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 の処理が実行されているのがわかります。
しかし、この書き方だとrequireとincludeの違いがいまいちわかりません。
では次の項目でrequireとincludeの違いについて説明していきます!
includeとrequireの違い
include文はrequire文と同様に外部ファイルを読み込みます。
決定的な違いとしては、
- require文は外部ファイルの読み込みに失敗すると、致命的なエラー(Fatal error)が発生する。
- include文は外部ファイルの読み込みに失敗すると、警告(Warning)が発生する。
となります。
致命的なエラーが発生すると、プログラムの処理は止まりますが、警告の場合はログにWarningを出力するだけで処理は継続されます。
include文についての詳しい解説やrequire文との速度比較については、以下の記事で解説しています!
PHPについてもっと知りたい方へ
require文は外部で記述されたPHPのプログラムやHTMLのフォーマットを読み込むときに非常に便利であることがわかりましたね!
「PHPについて実はいまいちわかっていない・・・」
「もっとPHPについて詳しく知りたい!」
と思っている方は以下の記事も参考にしてみてください!
まとめ
この記事ではrequire文について、
- require文とは
- require文の基本的な使い方
- require文でhtmlファイルを読み込む方法
- require文で読み込みが失敗した場合のエラーの出力方法
- requireとincludeの違い
などの外部ファイルを読み込む方法について解説しました。
外部ファイルはhtmlのヘッダ情報や関数や変数を再定義したいときなどに非常に便利ですので、使い方はよく理解しておきましょう!
もしrequire文の使い方を忘れてしまったら、この記事を思い出してくださいね!