PHPの「include」と「require」の違い


174

それらの間に違いはありますか?それらの使用は好みの問題ですか?どちらを使用してもメリットはありますか?どちらがセキュリティに優れていますか?



3
常に「require」を使用してください。「含む」はサウナの電気ドアと同じくらい便利です。
Marco Mariani

2
@MarcoMarianiどのように不便でしょうか?それはおそらく明らかです、私はそれを見ていません。おそらく蒸気ですか?
オースティンバーク2014年

簡単に言うと、 'foo.php'ファイルが誤って欠落している場合、foo.phpにあるはずの関数が呼び出されたときではなく、できるだけ早く知りたいのです。includeをrequireに置き換えると、多くの場合、バグが明らかになる可能性があります。config.phpがなく、アプリケーションがデフォルトの構成で実行されているとしましょう。どちらがセキュリティに優れていますか?サウナは、中にいて、どういうわけかドアが開かないのが嫌です。
マルコマリアーニ2014年

回答:


148

あなたはのページのrequire詳細なPHPマニュアルで説明されている違いを見つけます:

requireinclude失敗時以外はと同じですが、致命的なE_COMPILE_ERRORレベルのエラーも生成します。つまり、スクリプトが停止するのに対し、include E_WARNINGはスクリプトの続行を許可する警告()のみを発行します。

例については@efritzの回答を参照してください


6
tiposaurus.co.uk/2011/04/04/… 「require()とinclude()の主な違いは、ロードできないファイルがrequire()の場合(たとえば、そこにない場合)です。これは、ページの実行を完全に停止させる致命的なエラーを生成し、それ以上の出力は生成されません。一方、ロードできないファイルをinclude()した場合、これは単に警告を生成し、ページの作成を続けてください。」
stormwild 2012

3
「どちらを使用するかは状況によって異なります。require()は、ページの残りの部分に不可欠なファイルをロードするのに最適です。たとえば、データベース駆動型のWebサイトがあり、require()を使用して、データベースのログインとパスワードは、include()を使用するよりも明らかに推奨されます。この状況でinclude()を使用した場合、意図したよりも多くの警告とエラーが生成される可能性があります。 "
stormwild 2012

3
<?php if (isset($flibbertygibbet)) require 'file.php';この答えは完全に正しくないように見えるでしょう。そうしないと、条件が真ではない場合でも、致命的なエラーが発生します。 straceに触れようとしてもPHPは表示されませんfile.php
cHao

include()とは異なり、require()は、対象の行が実行されない場合でも、常にターゲットファイルを読み取ります。条件付きでファイルを含める場合は、include()を使用します。ANDただし、require()が発生する行が実行されない場合、ターゲットファイル内のコードも実行されません。反対のことを言っているようです、または私は誤解していますか?
2013

1
これらのコメントはすべて、この回答が編集される前の元のバージョンを参照しています。元々は無効なクレームif (false) require 'file.php';があり、「file.php」がロードされる(ただし実行されない)と主張していました。TLDRはこれらのコメントをすべて無視します。
Kevin Wheeler


5

使用する includeあなたのスクリプトが(場合には、それはなど存在しない)ファイルをロードせずに続けて気にしないならば、あなたは(あなたがべきではありませんが)警告・エラー・メッセージでライブが表示されていることができます。

を使用requireすると、指定したファイルを読み込めない場合にスクリプトが停止し、致命的なエラーがスローされます。


2

他の人が指摘したように、唯一の違いは、requireが致命的なエラーをスローし、含めることができることです-キャッチ可能な警告。どちらを使用するかについては、含めることを固執することをお勧めします。どうして?警告をキャッチして、エンドユーザーに意味のあるフィードバックを提供できるからです。検討する

  // Example 1.
  // users see a standard php error message or a blank screen
  // depending on your display_errors setting
  require 'not_there'; 


  // Example 2.
  // users see a meaningful error message
  try {
      include 'not_there';
  } catch(Exception $e) {
     echo "something strange happened!";
  }

注:たとえば、2が機能するには、http: //www.php.net/manual/en/class.errorexception.phpで説明されているように、エラーから例外へのハンドラをインストールする必要があります

  function exception_error_handler($errno, $errstr, $errfile, $errline ) {
     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  set_error_handler("exception_error_handler");   

包含レベルでは、期待しているファイルがそこにないことを知るのに最適な場所ではありません。あなたの例のどちらの問題も、あなたのウェブサイトの視聴者を押しのけてしまうものではありません。
Kzqai

0
<?PHP
echo "Firstline";
include('classes/connection.php');
echo "I will run if include but not on Require";
?>

コードを使用した非常にシンプルで実用的な例。 最初のエコーが表示されます。includeまたはrequireの前に実行されるため、includeまたはrequireを使用するかどうかは関係ありません。

結果を確認するには、コードの2行目で意図的にファイルへの誤ったパスを指定するか、ファイル名にエラーを作成します。したがって、表示される2番目のエコーは、requireまたはincludeを使用するかどうかに完全に依存します

requireを使用する、2番目のエコーは実行されませんが、includeを使用するとどんなエラーが発生しても、2番目のエコーの結果も表示されます。


-2

インクルードプログラムが終了せず、ブラウザに警告が表示される場合、ファイルが見つからない場合、必要プログラムは終了し、致命的なエラーが表示されます。


答えの2/3がすでに言っていることを繰り返すために、本当に2年半前の質問にぶつけなければなりませんでしたか?
cHao

4
ああ、彼は初心者です!おそらくSOの概念をまだ理解していません。
Dan Hanly 2013

貧しいユーザー2069222、今彼はSOを残しました: '(
Gagantous
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.