include・requireの使い分け - PHPプロ!Q&A掲示板

186

  • 300P

include・requireの使い分け

質問日時 / 2006年10月3日 13:48    回答数 / 6件

Questioner:  soule_soule  このエントリーをはてなブックマークに追加 

キーワード / include    require    once   

正直、PHPマニュアルをよくよんでも、正確にincludeとrequireの使い分けがわかりません。

実際にはどちらかを使い分けるべきなのでしょうか?
それとも統一するべきなのでしょうか?

また、_once が付いた物は重複して読み込まない為のセキュリティ機能と考えてよろしいのでしょうか?

複数質問してすみませんがよろしくお願いします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01kashiphp”正確な”といわれると考えてしまうところですが、、、
┃┗A01-1soule_souleご回答どうもありがとうございました。 やはりあち
┣A02kouichi66機能的にはかわりません。 個人的に以下の方法で使い
┃┗A02-1soule_souleご回答ありがとうございました。 PHP_CodeSnifferを
┗A03elf2000PEARの例の件をのぞくと,基本的にrequireとrequire_o
 ┗A03-1soule_souleいつもスマートなご回答ありがとうございます。 elf

回答一覧

並び替え:

A01 満足
answererkashiphp [10月3日 14:16]

”正確な”といわれると考えてしまうところですが、、、

http://www.php.net/manual/ja/function.include.php
にありますが、両者の違いはエラー時の挙動です。
それ以外は好みで使い分ければいいんじゃないかと思ってます。

include_onceは
http://www.php.net/manual/ja/function.include-once.php
にありますが、重複してDBコネクトをしようとしてしまったり、グローバル変数を書き換えてしまったりといったことを避けることができます。(複数回読み込まないようなロジックになっていればいいんでしょうが)
pearなどであちこちで参照する可能性があったりすると_onceになっていないと予想外の挙動をしてあわてることがあります。

この意見に回答する

ツリーへ TOPへ

A01-1
replyersoule_soule [10月6日 17:44]

ご回答どうもありがとうございました。

やはりあちこちで参照の可能性があるものについては _once ですね。

この意見に回答する

ツリーへ TOPへ

A02 満足
answererkouichi66 [10月5日 03:39]

機能的にはかわりません。
個人的に以下の方法で使い分けています。
PEARのライブラリーにコードの書き方をチェックするパッケージ
 PHP_CodeSniffer

というのがあります。
このパッケージのルールですと、
requireはファイルの初めに記述することを推奨し、
includeは関数内で記述することを推奨をしているようです。

「_once」は 重複して読み込む必要がある場合以外はつけたほうがいいと思います。

この意見に回答する

ツリーへ TOPへ

A02-1
replyersoule_soule [10月6日 17:48]

ご回答ありがとうございました。
PHP_CodeSnifferをはじめて知りました。

> requireはファイルの初めに記述することを推奨し、 
> includeは関数内で記述することを推奨をしているようです。 

正確な理由についてわかりにくいですが、下記のelf2000さんの回答にある、エラーの出力について考えられた理由がありそうですね。

この意見に回答する

ツリーへ TOPへ

A03 満足
answererelf2000 [10月6日 07:55]

PEARの例の件をのぞくと,基本的にrequireとrequire_once以外は使う必要はありません.
理由は

1)require系はファイルを読み込めなければ必ずエラーで停止する
2)include系はファイルを読み込めなければ必ず警告を(内部レベルでは)出力する

という挙動の違いがあります.
2)は「止まらないんだからいいんじゃね?」という考えもありますが,
例えばライブラリ(ライブラリでなく設定ファイルや単にデータの場合もあります)などは読み込んでも読み込まなくてもいいファイルは基本的にありません.
読み込まなければ動かない処理を今から書くのですから,ファイルの読み込みに失敗しても処理を続けるのはより意図しない処理が行われる可能性があります.
また,includeは警告を出力しますが,基本的に警告を出力します.
この警告を全体的に抑制(error_reportingで排除するなど)するのはPHPプログラミングではよくないこととされていますし(変数名のtypoに気づかないなどさまざまな実装上のミスが見えなくなります)
@演算子でincludeだけ警告を抑制することもファイルの欠落(正常に動いていても長い目ではそのファイルがHDDのエラーで読み込めなく,メンテナンス時に間違えて消してしまうなどの可能性もあります)に気づきにくくなります.
繰り返しになりますが,これはPHPスクリプトだけでなくデータでも同様の話です(includeで読み込んでるはずだから~って処理をつい書いていませんか?).

どうしてもファイルが存在していてもしていなくても読み込みたければfile_exists()などでファイルの存在を調べてrequireすればいいと思います.

この意見に回答する

ツリーへ TOPへ

A03-1
replyersoule_soule [10月6日 17:55]

いつもスマートなご回答ありがとうございます。
elfさんのご回答はいつも参考にさせていただいており、今回の件も非常に参考になりました。

> 例えばライブラリ(ライブラリでなく設定ファイルや単にデータの場合もあります)などは読み込んでも読み込まなくてもいいファイルは基本的にありません.
> どうしてもファイルが存在していてもしていなくても読み込みたければfile_exists()などでファイルの存在を調べてrequireすればいいと思います.

なんだかPEARコーディング規約もふっ飛ばすような正当性の高い理由かと思います。
本当にありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)