何度も使いまわしたいテンプレートのパーツがある際、PHPはとっても便利!
そのパーツを切り出してphp形式のファイルで保存することで、別ファイルから読み込ませることができます。
複数のファイルで出力ができる一方、管理は1ファイルで済むので、メンテナンス性に非常に優れています。
今回は、パーツとして作成したphpファイルを、他のページから読み込む方法を紹介します。
基本構文
外部のファイルを読み込ませる方法は、2つあります。
<?php require('パス'); ?>
<?php include('パス'); ?>
読み込むことができるファイルはphp形式に限らず、html形式なども読み込むことができます。
ただhtmlにしておく必要も特にないので、php形式にしておくのがベターです。
外部ファイル読み込み体験教室
まずは「index.php」を作成し、下記をコピペしましょう。
<?php require('parts.php'); ?>
次に「index.php」と同じ階層(同じフォルダ)に「parts.php」を作成し、下記をコピペしましょう。
読み込ませるだけなので、別にコピペじゃなくても好きなこと書いてもOK
<p>ほらね</p>
これで index.php をブラウザで見ると、外部からファイルが読み込めていることが確認できました!
しかも何度でも無限に呼び出すことができます。する必要なんてほぼありませんが!
<?php require('parts.php'); ?>
<?php require('parts.php'); ?>
<?php require('parts.php'); ?>
これで3回読み込んでいることが確認できました。
「で?」って思われるかもしれないですが、これに関連することが後ほど登場します!
requireとincludeの違い
適切に外部ファイルの読み込みに成功した時、その結果は全く同じで、何も違いはありません。
ただし読み込みに失敗したとき、
例えば読み込み先のファイルがなくなったときや、パスの指定を間違えているとき、処理に違いが発生します。
includeは読み込みに失敗しても処理が進んでいく
includeは読み込みに失敗した場合、それを無視して処理が進んでいきます。
<?php include('おもち.php'); ?>
<p>読み込みに失敗しても処理が継続していきます。</p>
コードをコピペして確認すると、ファイルの読み込みには失敗していますが、その下のpタグは通常に出力されていることがわかります。
requireは読み込みに失敗した時点で以降の処理が中断する
それに対しrequireは、読み込み失敗した時点で処理を終了し、以降全て処理されなくなります。
<?php require('おもち.php'); ?>
<p>処理自体が終了したので、このpタグは出力されない。</p>
コピペすると先ほどのincludeとは違い、pタグが出力されていませんね。
requireとincludeの使い分け
読み込みに成功した場合の結果は全く同じなので、読み込みに失敗することでどうなるのかが使い分けのポイント。
致命的なエラーを引き起こす原因となり得る場合はrequire
読み込みに失敗することで、それ以降にも致命的な支障がでる場合は迷わずrequireを使いましょう。
例えば読み込む予定のパーツに何らかのphp処理が含まれていて、その結果が以降の処理に影響を与えている場合などです。
読み込みに失敗してもまあ許容範囲の場合はinclude
ヘッダーやフッターなど、まあなければいけないものではあるのだが、最悪無くても死にはしない。
そんな時はincludeを使いましょう。
ヘッダーの読み込みに失敗したところで、問題なくコンテンツを見てもらえることができます。
迷ったらrequire
とりあえず迷ったらrequire使っとけば間違いないっす。
_onceで一度しか読み込めなくする
一番最初の体験で、requireやincludeは何度でも同じファイルを読み込めることを紹介しました。
ただ、読み込む先のファイルにPHPの記述がごちゃごちゃ書かれていて、2回読み込むことでエラーが発生してしまうことがあります。
その場合、たとえ間違って2回読み込ませても、1回しか読み込んでくれないようにすることができます。
<?php include_once('パス'); ?>
<?php require_once('パス'); ?>
_onceをつけることで、1度しか読み込ませないでくださいね、と指示をしています。
<?php include_once('parts.php'); ?>
<?php require_once('parts.php'); ?>
これを試してみましょう!
includeとrequireで1回ずつ同じファイルを読み込ませていますが、きちんと1度しか読み込まれていませんね。