自作のタイピングサイトや小説サイトにおいて、メニューなど共通の項目を外部ファイル化し、PHPを使って呼び出しています。
今まで何の疑問もなくincludeばかり使っていましたが、検索してたらreadfileってのもあるそうで。
使い分けを調べたのでまとめておきます。
(個人の小規模サイトでそこまで気にせんでええがなって気もしますが、、、)
面倒な子だと思ってるrequireについても、改めて覚え書きを。
include
よく紹介されてます。
一番何も考えずに使えるやつかもしれません。
外部ファイルを読み込もうとした時にエラーが起きても、そこで止まらず、ページが最後まで読み込まれます。
また、外部ファイルに書いたPHPも実行されます。(拡張子を”.html”や”.txt”にしていても実行されます)
例:
/* menu.php */
<a href="index.php">ホーム</a><br>
<a href="content.php">コンテンツ1</a><br>
/* index.php(のbody内) */
<p>★ホームだよ★</p>
<p>メニュー<br>
<?php include('menu.php'); ?>
</p>
/* index.phpにアクセス */
★ホームだよ★
メニュー
ホーム
コンテンツ1
/* ↑のソース */
<p>★ホームだよ★</p>
<p>メニュー<br>
<a href="index.php">ホーム</a><br>
<a href="content.php">コンテンツ1</a><br>
</p>
同じファイルを読み込むコードを、ページの複数か所に書くこともできます。
なので、「上と下に同じメニューを置こう」とか、「ランダム広告をあっちとこっちに」といった用途にも使えます。
あと、htmlの<head>部分を外部ファイルにするのも便利そうですが、PHPのローカル環境がないと表示テストが大変なので、この点が壁です。
include_once
includeの亜種。
同じファイルが二度出てきたら、二度目は読み込まない、という点が違います。
例:
/* menu.php */
<a href="index.php">ホーム</a><br>
<a href="content.php">コンテンツ1</a><br>
/* index.php(のbody内) */
<p>メニュー1<br>
<?php include_once('menu.php'); ?>
</p>
<p>★ホームだよ★</p>
<p>メニュー2<br>
<?php include_once('menu.php'); ?>
</p>
/* index.phpにアクセス */
/* メニュー2は読み込まれない */
メニュー1
ホーム
コンテンツ1
★ホームだよ★
メニュー2
/* ↑のソース */
<p>メニュー1<br>
<a href="index.php">ホーム</a><br>
<a href="content.php">コンテンツ1</a><br>
</p>
<p>★ホームだよ★</p>
<p>メニュー2<br>
</p>
アクセス解析のコードを貼る時に、この関数がお勧めされていたりします。
ダブルカウントを防げるからです。
他にも、一度読みこんだ変数を上書きされたくない時、なんかに良いようです。
それでいて、うまく読み込めなくてもそんなに困らない物、に適しています。
アクセス解析などは、読み込みに失敗しても、ページの表示自体には影響ないですよね。
readfile
これですよ。
つい最近知ったやつ。
ファイルの中身を、そのままペタリと貼り付けるだけの関数です。
上記のようなhtmlだけのファイルを呼び出すなら、じつはこちらの関数で十分です。
/* menu.html */
<a href="index.php">ホーム</a><br>
<a href="content.php">コンテンツ1</a><br>
/* index.php(のbody内) */
<p>★ホームだよ★</p>
<p>メニュー<br>
<?php readfile('menu.html'); ?>
</p>
/* index.phpにアクセス */
★ホームだよ★
メニュー
ホーム
コンテンツ1
/* ↑のソース */
<p>★ホームだよ★</p>
<p>メニュー<br>
<a href="index.php">ホーム</a><br>
<a href="content.php">コンテンツ1</a><br>
</p>
というわけで、単なるHTMLとか、テキストをただ貼りたい時は、readfileが適しています。
includeを使わなくても、こちらで足りる場合も多いんじゃないかと。
読み込むファイルにPHPが書いてあっても、拡張子が”.php”であっても、実行されずにそのまま貼られます。
PHPタグを探さない分、関数の動作は軽いようです。
あと、ファイルを読み込めなくても処理が止まることはないです。この点はincludeと一緒。
require
大抵includeとセットで紹介されてる関数です。
指定したファイルが読み込めないと、エラー吐いて処理が止まるやつです。
読み込むファイルのPHPは、includeと同じく実行されます。
書き方:
<?php require('ファイル名'); ?>
これを読み込めないと、ページとして成り立たない! ってファイルに適しています。
ショッピングサイトの商品の部分とか、かな?
見られないと、ページとして意味をなさないですよね。
require_once
requireの亜種です。
同じファイルが二度出てきたら、二度目は読み込みません。
あとはrequireと同じで、エラーが出ると止まります。
書き方:
<?php require('ファイル名'); ?>
このファイルがないと始まらない、かつ、上書きされたら死ぬ、という場合に。
ページを動かす根幹の関数・変数を持ってるファイル、とか。(うまく想像できない)
良い例が思い付かないので、この関数は、今の私のレベルよりも上のようです。
まとめ
結局、
個人サイトで、自分で全部のファイルを把握してる! って場合は、includeで足ります。
呼び出すファイルにPHPを書いてなければ、readfileで足ります。
include_onceまで使わなくて良いです。
どこに何を貼ったか分かっていれば。
だから、初心者向けにやたらincludeばかり情報が見つかるのは、別に間違ってるわけでもないのだなあ、と思いました。
どのファイルに何を書いてあるか把握するのが面倒だったり、サイトの規模が大きくなってきて大変、ってな場合は、適宜関数の仕様に頼れば良いのだと思います。
ページ全体やサイト内を把握するのが楽か、関数を使い分ける方が楽か。
自分の把握力や経験値と、サイトのボリューム・内容との、バランスの問題になるのでしょう。
一方、既製のシステムやフレームワークを使っていたり、複数人で開発してる場合。
または、訪問者さんが書き込みをするようなサイトの場合。
思わぬ所に思わぬモノが潜んでたりします。きっとたぶん。
なので、関数の特徴を理解した上で、使い分けをするべきなのだと思います。
PHPが書かれているファイルをreadfileで呼んだら動きません。
逆に、意図しないコードが入っているかもしれないファイルをincludeしたら、何が起きるか分かりません。(セキュリティ的な意味でも)
また、「一度だけ、確実に」読み込みたいファイルは「require_once」で呼ばないと、どこがエラーの元だか分からなくなってしまうでしょう。
気を付けて使いましょう、という事です。
余談
今回調べていて、呼ぶファイルのパスの指定の仕方も色々あるみたい、と何となく学びました。
これは理解できたら便利そうです。
メニューの外部ファイルで使えそうなので、追々勉強してみようかと思っています。
そんな感じです。
発展途上であります。
参考
PHP: include – Manual
PHP: require – Manual
PHP: readfile – Manual
include()とrequire()の違い | PHP入門編
関連記事
コメント