PHP PHP入門講座 プログラミング

【PHPプログラミング入門講座】ファイルの分割とファイルの読み込み

PHPプログラミングのキービジュアル

画面遷移する2つのページを作る

今までに説明してきた内容を使って、2つのページを作成し、一方からもう一方のページに遷移をするPHPプログラムを作ってみましょう。

まずは、次の2つのPHPファイルを指定のファイル名で作成してください。

ファイル名:index.php

<?php
  $title = 'テストページ';
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title><?= $title; ?></title>
  </head>
  <body>
    <h1><?= $title; ?></h1>
    <p><a href="index2.php">次のページへ</a></p>
  </body>
</html>

ファイル名:index2.php

<?php
  $title = 'テストページ';
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title><?= $title; ?></title>
  </head>
  <body>
    <h1><?= $title; ?></h1>
    <p>次のページに遷移しました。</p>
  </body>
</html>

実際の画面は次のようになります。
1ページ目(index.php)にある「次のページへ」リンクをクリックすると、2ページ目(index2.php)に画面遷移します。
(余談ですが、最近のMacOSでフォント指定してないWebページを表示すると、明朝体で表示されるようになりました。前のようにゴシック体で表示するように戻してくれないかなぁ。)

画面遷移する2つのHTML 1
画面遷移する2つのHTML 2

PHPの便利な機能

ところで、この2つのPHPファイル(index.php, index2.php)の内容ですが、全く共通な部分があります。
再度、index.phpとindex2.phpのソースを以下に掲載し、共通部分をハイライトで表示しました。

ファイル名:index.php

<?php
  $title = 'テストページ';
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title><?= $title; ?></title>
  </head>
  <body>
    <h1><?= $title; ?></h1>
    <p><a href="index2.php">次のページへ</a></p>
  </body>
</html>

ファイル名:index2.php

<?php
  $title = 'テストページ';
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title><?= $title; ?></title>
  </head>
  <body>
    <h1><?= $title; ?></h1>
    <p>次のページに遷移しました。</p>
  </body>
</html>

index.phpとindex2.phpの両方で<p>タグの上側のHTMLソースが全く同じであり、また<p>タグの下側のHTMLソースも全く同じことが確認できましたでしょうか?

さて、ここでPHPの便利な機能を紹介します!

PHPでは、複数ファイルで共通な部分(ソース)を別の1ファイルに分離し、それを共通ファイルとして複数のファイルから読み込ませることができます。
このようにすると、共通ファイル1ファイルを修正する場合は、その修正内容が読み込まれている複数のファイル全てに反映させることができます。

HTMLにはこのような機能はありません。
便利ですよね!?

言葉だけではピンと来ないかもしれませんので、実際に作ってみましょう。

共通部分を別のファイルに分離する

それでは、実際に共通部分を別のファイルに分離してみましょう。
手順は次のとおりです。

<p>タグより上のHTMLソースをheader.phpという名前のPHPファイルを作成してそこに記述し、<p>タグより下のHTMLソースをfooter.phpという名前のPHPファイルを作成してそこに記述します。
次のようになります。

ファイル名:header.php

<?php
  $title = 'テストページ';
?>
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title><?= $title; ?></title>
  </head>
  <body>
    <h1><?= $title; ?></h1>

ファイル名:footer.php

  </body>
</html>

そして、index.php、index2.phpは、header.phpとfooter.phpに移動した部分を次のハイライトで示したように書き換えます。

ファイル名:index.php

<?php include('header.php'); ?>
    <p><a href="index2.php">次のページへ</a></p>
<?php include('footer.php'); ?>

ファイル名:index2.php

<?php include('header.php'); ?>
    <p>次のページに遷移しました。</p>
<?php include('footer.php'); ?>

これで、分離したheader.phpとfooter.phpをindex.phpとindex2.phpから読み込ませることができます。
共通化して、かなりソースがシンプルになりました♪

ここで、今までに見たことがない新しい記述が出てきました。
include('header.php');」「include('footer.php');」です。
これは「include関数」と呼ばれるものです。

「関数」の詳しい説明は、今後の記事でします。
とりあえずは、include関数の使い方について説明します。
まずは構文です。

<include関数の構文>

include('読み込むファイル名');

include関数を使うと、それを記述た箇所に指定した読み込むファイルの内容がそのまま組み込まれます。

以上で、共通部分をファイルに分離する作業は完了です。

完成したら、実際にindex.phpにアクセスして動作確認してみましょう。
ファイル分割前と見た目は変わらず表示されます。

include関数と似た機能の関数

PHPには、include関数と似た機能の関数がいくつか存在します。

関数名 構文 説明
include include('ファイル名');
または
include('ファイルパス');
ファイルを読み込みます。
ファイルが存在しない場合は警告(warning)を表示。
include_once include_once('ファイル名');
または
include_once('ファイルパス');
ファイルを1回だけ読み込みます。
2回目に同じファイルを指定した場合は読み込みません。
ファイルが存在しない場合は警告(warning)を表示。
require require('ファイル名');
または
require('ファイルパス');
ファイルを読み込みます。
ファイルが存在しない場合は致命的エラー(fatal error)を表示。
require_once require_once('ファイル名');
または
require_once('ファイルパス');
ファイルを1回だけ読み込みます。
2回目に同じファイルを指定した場合は読み込みません。
ファイルが存在しない場合は致命的エラー(fatal error)を表示。


機能的にはほぼ変わらないため、好みでどれを使っても良いのですが、筆者の経験的に、一般的にHTMLソースなどの共通ファイルの読み込みの場合はinclude関数、共通のPHPプログラムの処理が書かれているファイルの読み込みはrequire_once関数が使われています。
その理由は次のとおりです。

HTMLソースなどの共通ソースのファイルを読み込む場合にinclude関数を使うのが良い理由

  • 万が一ファイルが存在しない場合でもページは表示したいので、致命的エラー(fatal error)ではなく警告(warning)レベルのエラーで良い。
  • HTMLソースは同一ページ内で複数箇所読み込みたい場合があるので、include_once、require_onceは使えない。

共通のPHPプログラムのファイルを読み込みむ場合にrequire_once関数を使うのが良い理由

  • 万が一ファイルが存在しない場合は、プログラム処理が抜け落ちるているということなので、致命的(fatal error)エラーとして扱うのが良い。
  • 同じ処理を何度も読み込むのは無駄であるし、プログラムの記述内容によって二重定義エラー(同じ処理を2回記述しているエラー)が発生するため、それを回避する。

読み込みファイルをファイルパスで指定する

include関数、include_once関数、require関数、require_once関数には、ファイル名だけでなく、ファイルパスも指定することができます。
ファイルパスは、相対パスで記述する方法と絶対パスで記述する方法があります。

ファイルパスに相対パスを指定する場合

相対パスの場合はHTMLタグのAタグと同じように記述できます。

(例1) include関数を記述するPHPプログラムと同じ階層(カレントディレクトリ(※補足1))に「parts」ディレクトリ(フォルダ)があり、その中の「header.php」ファイルを読み込む場合

include('parts/header.php');

または

include('./parts/header.php');

(例2) include関数を記述するPHPプログラムが置いている上の階層(ディレクトリ)の「header.php」ファイルを読み込む場合

include('../header.php');

※補足1:カレントディレクトリとは、カレント(現在の)ディレクトリという意味で、対象となるファイルが存在する場所(ディレクトリ)という意味です。良く使う言葉ですので、覚えておきましょう。

※補足2:上記ファイルのパスの指定で使用した「 . 」と「 .. 」の記述はHTMLのAタグのリンクなどにも良く使われますが、念のため説明すると、「 . 」は現在の場所(カレントディレクトリ)、「 .. 」は現在のディレクトリのひとつ上の階層(ディレクトリ)という意味です。

ファイルパスに絶対パスを指定する場合

相対パスに対して、絶対パスもありますが、サーバーOS(Linux)のディレクトリ構成とWebサーバーの知識がないと、少し理解するのが難しいかもしれません。
また、Webサイトを作るくらいでしたら、絶対パスを使用しなくても開発できます(※補足3)。
だから、今のところ絶対パスについては、こういう指定もできるという程度の理解で大丈夫です。

PHPの絶対パスは、HTMLのAタグのリンクに指定する絶対パスとは考え方が違います。
以下にそれぞれについて説明します。

HTMLのAタグのリンクに指定する絶対パス

HTMLのAタグのリンクに指定する絶対パスは、http(s)://から始まるURL、またはURLの「http(s)://ドメイン」を除いた「/」から始まるURLです。

(例) https://www.example.com/aaa/bbb/ccc/index.html
  または
  /aaa/bbb/ccc/index.html

<HTMLのAタグの記述例>

<a href="https://www.example.com/aaa/bbb/ccc/index.html">テキスト</a>

または

<a href="/aaa/bbb/ccc/index.html">テキスト</a>

PHPのinlude関数などに指定する絶対パス

PHPで使用する絶対パスは、サーバー内部のルートディレクトリ「 / 」からのパスです。
よって、ドキュメントルート(※補足4)配下だけに限らず、サーバー内のファイルのパスも指定することもできます(※補足5)。

(例) /var/www/html/aaa/bbb/ccc/index.php

<include関数の記述例>

include('/var/www/html/aaa/bbb/ccc/index.php');

※補足3:絶対パスを必ず使わなければならない場合の例として、Linuxのcronと呼ばれる機能を使って定期的にプログラムを自動実行する場合などがあります。

※補足4:ドキュメントルートとは、Webサイトのファイル(HTML/JS/CSS/画像/PHPなど)を置く最上階層のディレクトリのことです。

※補足5:ただし、Webサーバーに対して読み込み権限があるファイルに限ります。

おわりに

今回は、include関数などを使った共通部分をファイル化する方法ついて説明しました。
共通ファイルを作成すると、同じことを何度も書かなくても良くなります。
そして、共通部分を修正がすると、共通ファイルを読み込んでいる全ページに対して反映されるなど、開発効率が向上するメリットがあります。
ファイル分割できる機会があれば、積極的に活用していきましょう。

PHPプログラミング入門講座 〜 全記事一覧 〜

-PHP, PHP入門講座, プログラミング
-, , , ,

Copyright© ハッピー・プログラミング・ライフ , 2020 All Rights Reserved.