require、include、require_once、include_onceの違いは?


回答:


1426

あるrequireinclude_once同様。

だからあなたの質問は...

  1. requirevsはいつ使用すべきincludeですか?
  2. いつrequire_oncerequire

ここでは1に対する答えを説明します

require()関数はinclude()と同じですが、エラーの処理方法が異なります。エラーが発生した場合、include()関数は警告を生成しますが、スクリプトは実行を継続します。require()は致命的なエラーを生成し、スクリプトは停止します。

2の答えはここにあります

require_once()ステートメントはrequire()と同じですが、PHPはファイルがすでにインクルードされているかどうかをチェックし、インクルードされている場合は再度インクルード(require)しません。


58
require()はrequire_once()よりも高速に実行されるので、重複するインクルードがないことが確実な場合はrequire()を使用してください。
dialex

48
@ DiAlex、require_onceは低速ですが、ほとんど測定できません。
ファルケン教授の契約が2013年

77
@DiAlex ...そして、ファイルが実際に既に含まれていることが判明した場合require_once()、2つのうちの方が速くなります
Tom

11
@ Prof.Falkenどのような状況で同じファイルを複数回必要とする必要がありますか?私の現在のマインドセットの中でそれを考えることはできません。
Weishi Zeng

17
@WeishiZeng for web pages、複数回含めたいHTMLスニペットがあるかもしれません。
James Beninger、2016

406

使用する

  • 必要とする
    ファイルがされたときに必要な、重要なメッセージテンプレートやアプリが壊れることになることなく、設定変数を含むファイルを、たとえば、アプリケーションで。


  • ファイルに後続のインクルードでエラーが発生するコンテンツが含まれている場合はrequire_once。たとえば function important() { /* important code */}、アプリケーションで間違いなく必要ですが、関数を再宣言できないため、再度インクルードしないでください。

  • 含める たファイルは必要ありませんし、見つからない場合はアプリケーションフローは、例えば継続すべき時に
    現在のスコープか何かから変数を参照するテンプレートの偉大を

  • include_once
    オプションの依存関係。後続のロードでエラーが発生するか、HTTPオーバーヘッドのために2回発生させたくないリモートファイルのインクルード

しかし、基本的には、どれをいつ使用するかはあなた次第です。


(データベースへの) PDO接続があります。どちらを使用すればよいですか?includeinclude_oncerequirerequire_once
Shafizadeh

6
これは、w3schoolsのみをリンクする他の回答ではなく、簡単に質問に回答して公式マニュアルにリンクするため、受け入れられる回答になるはずです。
Daniel W.

9
必要がない場合、それを含める理由を教えてください。
フランシスコオチョア2016年

1
ヘッダー、列、フッターなどのセクションがある一般的なページレイアウトのテンプレートを使用しています。これにより、サイトのすべてのページにそのテンプレートを提供でき、ページフォルダー構造にファイルを作成するだけで、それらの位置のそれぞれに入る必要があります。ページにサイドバーが必要ないと判断した場合は、そのページのフォルダーにあるファイルを除外するだけで、テンプレートはファイルが存在しなくても問題なく機能します。
James Coyle 2017

301

私の提案はrequire_once、時間の99.9%を使用することです。

を使用するrequireか、include代わりに、コードが他の場所で再利用できないこと、つまり、実際に取り込んでいるスクリプト、実行することの代わりにコードを利用可能 Aクラスまたはいくつかの関数ライブラリを。

その場で実行するコードを必要とする/含める場合、それは手続き型コードであり、新しいパラダイムを知る必要があります。オブジェクト指向プログラミング、関数ベースのプログラミング、または関数型プログラミングのように。

既にオブジェクト指向プログラミングまたは関数型プログラミングを行っている場合、スタックのどこでバグ/エラーを見つけるかを使用するinclude_onceと、ほとんどの場合遅延します。do_cool_stuff()後でそれを呼び出すときに関数が使用できないこと、またはライブラリを要求することによって関数が使用可能であると予想される瞬間に、関数が使用できないことを知りたいですか?一般に、必要なものや期待するものが利用できない場合は、すぐに知るのが最善です。require_once

または、最新のOOPでは、使用時にクラスをオートロードするだけです。


41
+1これは受け入れられた答えであるはずです。キーポイントは、ということですinclude(それが存在しないのいずれかの可能性を持っているファイルを含むことはかなり稀だから)、およびそのうちの家族は、通常は完全に悪い考えているrequire_oncerequire、あなたが使用する必要があるrequire_onceファイルを含めたときに定義する関数やクラスを他の場所で使用requireしたり、データベース接続オブジェクトのようなシングルトンをインスタンス化したり、インクルードされるとすぐに処理を行うファイルをインクルードするために使用します。大規模なWebアプリケーションでは、後者のインクルードは珍しいものです。
Mark Amery 2013年

7
+1(別のゴールドバッジを持っている;))require_onceほぼ常に使用される可能性が最も高い候補であることに同意します。選択肢間のオーバーヘッドのわずかな違いを考えると、requireスクリプトが確実に停止するため、ファイルが含まれていなくてもアプリケーションが存続できる多くのシナリオは考えられません。そして_once、重複の問題から保護します。同意しない人は、自分が何をしているのかを知っている可能性が高いため、アプリケーションまたはシナリオに適したものを選択できます。
James

ねえ、時々インデックスページに含まれるファイルがあり、man timeが直接呼び出されます(home.php)...........これで、require関数を使用してインデックスページに設定ファイルが既に含まれていますrequire_onceを使用できます
re.include

@RavinderPayalさて、私の最初のアドバイスは、フロントコントローラーを使用して頭痛を軽減することです。ユーザーがexample.com/homeを呼び出すからといって、完全に独立したhome.phpが必要なわけではありません。代わりに、/ home /は、index.phpまたはfront.phpのフロントコントローラを介してルーティングする必要があります。昔ながらの「ページごとに1つのスクリプト」アプローチを可能にするのはphpだけで、これは最善の方法ではありません。しかし、別個のhome.phpとindex.phpが必要な場合は、両方に入る可能性のあるものはすべて、ライブラリファイルまたはテンプレート、.. / templates / home.tplまたは../view/home.view.phpに含める必要があります。ええと?
Kzqai、2015年

そのSNSと私は開発を簡単にするために最初に1ファイル1ページのアプローチを選択し、それを再作成できない大量のファイルをスタックし、今ではその問題を解決し、1ファイル1ページを実行する他の理由はスピードとハードディスクとの接触が少ないことです
インクルード

36

_once関数を使用した場合と使用しない場合の違い:_once関数を使用しない場合、コードは再度インクルードされますが、_once関数を使用すると、PHPはインクルードされたファイルを追跡し、一度だけインクルードします。

requireとincludeの違い:必要なファイルが見つからない場合、PHPは致命的なエラーを出力しますが、includeの場合は警告のみが出力されます。


1
短くてシンプル!
ヴラド

31

include() ファイルを含めることができない場合は警告がスローされますが、スクリプトの残りの部分は実行されます。

require()E_COMPILE_ERRORファイルを含めることができない場合は、スクリプトをスローして停止します。

include_once()そしてrequire_once()それがすでに含まれている場合の関数は二度目のファイルが含まれていません。

次のドキュメントページを参照してください。


22

あなたが使用しているときはいつでもrequire_once()あなたは、現在のファイル内に一度だけ呼ばれるファイルを必要なときに別のファイルをインクルードするファイルで使用することができます。この例では、test1.phpを使用しています。

<?php  
echo "today is:".date("Y-m-d");  
?>  

そして私がtest2.phpという名前の別のファイルに

<?php  
require_once('test1.php');  
require_once('test1.php');  
?>

test1ファイルを2回必要とするmを見ているが、ファイルにはtest1が1回含まれ、2回目に呼び出す場合は無視されます。そして、停止せずに出力を1回表示します。

'include_once() `を使用しているときはいつでも、呼び出されたファイルが現在のファイルで複数回必要なときに、ファイルで別のファイルを含めることができます。この例では、test3.phpという名前のファイルがあります。

<?php  
echo "today is:".date("Y-m-d");  
?> 

そして私がtest4.phpという名前の別のファイルで

<?php  
include_once('test3.php');  
include_once('test3.php');  
?>

mを監視していると、test3ファイルを含むファイルは1回だけ含まれますが、それ以降の実行は停止します。


「アドバイスより良い例」
Ramesh Kithsiri HettiArachchi

19

再利用可能なPHPには「include」を使用しますテンプレートに。必要なライブラリには「require」を使用します。

「* _once」は、ファイルがすでにロードされているかどうかをチェックするので便利ですが、「require_once」でしか意味がありません。


18

クラスと関数の定義はファイルに整理しておく必要があります。

依存関係(クラス、関数、定数)require_once()を読み込むために使用します。

テンプレートのようなファイルrequire()をロードするために使用します

オプションの依存関係(クラス、関数、定数)include_once()をロードするために使用します。

オプションのテンプレートのようなファイルinclude()をロードするために使用します


16

2018年の7年後の回答

この質問は7年前に尋ねられたものであり、どの回答も質問に対する実用的な助けにはなりません。最近のPHPプログラミングでは、主にrequired_once一度だけオートローダークラス(コンポーザーオートローダー)を含めるために使用し、すべてのクラスと関数をロードします(関数ファイルcomposer.jsonは、他のすべてのファイルで使用できるようにファイルに明示的に追加する必要があります)。何らかの理由で、使用するオートローダーからクラスをロードできない場合require_onceします。

私たちが使用する必要があるいくつかの機会がありますrequire。たとえば、非常に大きな配列定義があり、これをクラス定義のソースコードに追加したくない場合は、次のことができます。

 <?php
// arr.php
return ['x'=>'y'];

 <?php
//main.php
$arr= require 'arry.php'

含める予定のファイルに実行可能ファイルが含まれている場合、または変数を宣言している場合は、ほとんど常に使用する必要がありrequireますrequire_onceます。最初から離れと、コードが実行されないか、変数が暗黙的に開始されず、バグが発生するためです。正確に特定するのは非常に困難です。

以下のための実用的なユースケースはありませんincludeし、include_once実際には。


オートローダーについて言及する場合は+1。ただし、最後の文には異議があります。多くの場合、include()出力バッファにラップされたを使用して、テンプレートエンジンを実装します。
HAZ

また、最新のテキストエディタと最新のPHPを考えると、require()大きなファイルを分割するために使用する人はほとんどいません。
haz 2018年

require_once関数内でPHPMailer を使用するときに同じ問題に直面し、オートローダー$mailがコードで後で必要な変数を定義しているため、次の変数require_onceは無視され、$mail初期化されていません!解決策はrequire、関数呼び出しの後に単に使用することでした。
Youssef

@haz requireそのような場合に使用しない理由はありますか?
PHPst 2018年

@ChristofferBubach LOL
PHPst

15

違いは、コマンドが生成するエラーです。ではrequire、使用したいファイルが本当に必要なので、E_ERROR見つからない場合はを生成します。

require()include() 失敗時以外はと同じですが、致命的なE_ERROR レベルのエラーも生成します。

include のみを生成します E_WARNING失敗した場合にエラーがます。

したがって、残りのコードを機能させるためにファイルが必要であり、スクリプトがファイルを失敗させるようにしたい場合は、これを使用できません。


の場合*_once()

include_once() スクリプトの特定の実行中に同じファイルが含まれ、評価される可能性がある場合に使用できます。この場合、関数の再定義、変数値の再割り当てなどの問題を回避するのに役立ちます。

require_once()もちろん同じことが当てはまります。


リファレンス:require()include_once()


requireE_ERRORではなく、E_COMPILE_ERRORを返します。
Yousha Aleayoub 2017

過去7年間で変化したようです。
Felix Kling 2017

9

requireを使用すると、ファイルが存在する必要があります。存在しない場合は、エラーが表示されます。インクルード-ファイルが存在しない場合、ページは引き続き読み込まれます。


8

承認などの重要な部分を必要とし、その他すべてを含めます。

複数のインクルードは非常に悪いデザインであり、まったく避ける必要があります。したがって、* _ onceは重要ではありません。


7

含める / 要求する同じファイルを複数回含めることもできます。

require()はinclude()と同じですが、失敗すると致命的なE_COMPILE_ERRORレベルのエラーも生成します。つまり、スクリプトは停止しますが、include()は警告(E_WARNING)を発行するだけで、スクリプトを続行できます。

require_once / include_once

PHPがファイルがすでにインクルードされているかどうかをチェックし、そうである場合は再度インクルード(require)しないことを除いて、include / requireと同じです。


5

include()ファイルが見つからない場合は警告が生成されますがrequire_once()、致命的なエラーが生成されます。

もう1つは、ファイルが以前に含まれていた場合です。その後require_once()、それを再び含めることはありません。


5

私は次のように関数を使用していました:

function doSomething() {
    require_once(xyz.php);
    ....
}

xyz.phpで定数値が宣言されていました。

別のPHPスクリプトファイルからこのdoSomething()関数を呼び出す必要があります。

しかし、この関数をループで呼び出しているときの動作を観察しました。最初の反復では、doSomething()は内xyz.phpで定数値doSomething()を取得していましたが、後ですべての反復で宣言された定数値を取得できませんでしたxyz.php

からrequire_once()に切り替えることで問題を解決しましたinclude()。更新されたdoSomething()コードは次のとおりです。

function doSomething() {
    include(xyz.php);
    ....
}

これで、を呼び出すたびdoSomething()に、で定義された定数値が取得されxyz.phpます。


4

マニュアルから:

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

同じことが_once()バリアントにも当てはまります。


4

PSR-0 / PSR-4オートローダーの時代には、一部の関数/クラスをコードで利用できるようにするだけであれば、ステートメントを使用する必要はまったくないかもしれません(もちろん、require_onceブートストラップファイルやincludeテンプレートでオートローダー自体をオートローダーにする必要がある場合は、 PHPをテンプレートエンジンとして使用します)。


3

 

  1. とき1を使うべきrequireinclude

    requireそしてinclude機能同じタスクを行う、つまりは含まれており、指定されたファイルを評価し、その差がrequire指定したファイルの場所が無効またはに対し、任意のエラーのためにあるときに致命的なエラーが発生しますinclude警告を生成し、コードの実行を継続します。

    したがってrequire、含めようとしているファイルがシステム中心であり、残りのコードに大きな影響を与える可能性がある場合に関数を使用できます。include関数インクルードしようとしているファイルが重要度の低いコードを含む単純なファイル。

    私の個人的な推奨事項(それほど重要ではないコード)はrequire、コードをデバッグし、後ですべてのrequire関数をinclude関数に置き換えてからプロダクションに移動してから失敗した場合に備えて、コードのあらゆる場所で関数にアクセスすることですエンドユーザーに影響を与えず、残りのコードが適切に実行されるバグ...

  2. いつ使用すべきrequire_oncerequire

    requirerequire_onceis の基本的な違いはrequire_once、ファイルが既に含まれているかどうかをチェックします。既に含まれている場合、ファイルは含まれませんが、require関数はファイルが既に含まれているかどうかに関係なくファイルを含めます。

    したがって、コードの一部を繰り返しrequire含めたい場合は関数を繰り返し使用しますが、コードにコードを1回だけ含めたい場合はを使用しますrequire_once


2
  1. クラス、関数、または依存関係をロードする必要がある場合は、require functionを使用します

  2. テンプレート形式のファイルをロードする場合は、include関数を使用します

それでも混乱する場合は、require_onceを常に使用してください。


1

これらはすべて、ファイルを含める方法です。

必要とは、それが必要であることを意味します。Require_onceは、それが必要になることを意味しますが、必要なのは1回だけです。含めるとは、ファイルを含めますが、続行する必要がないことを意味します。

例:

Require 'filename'
Require_once 'filename'
Include 'filename'

ファイルを1回だけインクルードするinclude_once関数もあります。

Include_once 'filename'

携帯電話から入力しているときは、大文字を使用しないでください。


1

気付いたのは、インクルードを使用すると、インクルードされたファイルの関数からのみ、インクルードされたファイルにアクセスできることです。require_onceを使用すると、2番目のrequired_onceファイルでその関数を実行できます。

また:追加をお勧めします

if(file_exists($RequiredFile)){
    require_once($RequiredFile);
}else{
  die('Error: File Does Not Exist');
}

require_onceがページを削除すると、ウェブサイトファイルのディレクトリがエコーされる場合があるため

これは、ファイルを要求するために作成したカスタム関数です。

function addFile($file, $type = 'php', $important=false){
    //site-content is a directory where I store all the files that I plan to require_once
    //the site-content directory has "deny from all" in its .htaccess file to block direct connections
    if($type && file_exists('site-content/'.$file.'.'.$type) && !is_dir('site-content/'.$file.'.'.$type)){
        //!is_dir checks that the file is not a folder
        require_once('site-content/'.$file.'.'.$type);
        return 'site-content/'.$file.'.'.$type;
    }else if(!$type && file_exists('site-content/'.$file) && !is_dir('site-content/'.$file)){
        //if you set "$type=false" you can add the file type (.php, .ect) to the end of the "$file" (useful for requiring files named after changing vars)
        require_once('site-content/'.$file);
        return 'site-content/'.$file;
    }else if($important){
        //if you set $important to true, the function will kill the page (which also prevents accidentally echoing the main directory path of the server)
        die('Server Error: Files Missing');
        return false;
    }else{
        //the function returns false if the file does not exist, so you can check if your functions were successfully added
        return false;
    }
}

使用例:

$success = addFile('functions/common');

if($success){
    commonFunction();
}else{
    fallbackFunction();
}

0

基本的に、間違ったパスが必要な場合、PHPは致命的なエラーをスローしてシャットダウン関数が呼び出されますが、間違ったパスを含めると、PHPは実行を継続しますが、ファイルが存在しないという警告を表示するだけです。

英語の単語requireから、ページまたはファイルの実行は必要なファイルに依存することがPHPに通知されます。

私の経験では、構成ファイル、データベースクラス、その他の重要なユーティリティなどの重要なファイルを要求することは通常のことです。


0

多くの場合、クライアントライブラリを条件付きでロードするか、それとも使用するかどうかに関係なくロードするかが問題になります。

具体的な例を次に示します。pcjの発言について詳しく説明します。

データベースのユーザー名とパスワードを保存する設定ファイル(conf.php)があるとします:

<?php
//my site configuration file

//For Database
$location='localhost';
$dbuser='yourname';
$userpw='yourpassword';
$database='nameofdatabase';
?>

そして、データベースを使用する静的関数を持つクラス:

<?php
class UsedInLoop {
    public static function databaseQuery(){
        require(/path/to/conf.php);                //require_once will not work here
        $db = new mysqli($location, $dbuser, $userpw, $database);
        //yada yada yada
    }
}
?>

そして、その静的関数は、ループ内で繰り返し呼び出されている別の関数の内部で使用されます。

<?php
require_once('path/to/arbitraryObject.php');  //either will likely be OK at this level
$obj = new arbitraryObject();
foreach($array as $element){
    $obj->myFunction();
}
?>

クラスを要求/含めることができるのは1回だけです。ループの反復ごとにそれを必要とする/含めると、エラーが発生します。ただし、静的関数が呼び出されるたびにconfファイルを含める必要があります。

<?php
class arbitraryObject {
    public function myFunction(){
        require_once(/path/to/UsedInLoop.php);   //This must be require_once. require() will not work
        UsedInLoop::databaseQuery();
    }
}
?>

もちろん、それを関数の外に移動すると、その問題の解決策になる可能性があります。

<?php
require(/path/to/UsedInLoop.php);   //now require() is fine   
class arbitraryObject {
    public function myFunction(){
        UsedInLoop::databaseQuery();
    }
}
?>

特定の状況でのみ使用される可能性があり、使用されていないときにそれをロードしたくないクラスをロードするオーバーヘッドに関心がない場合を除きます。


-1

requireinclude最初にファイルを解析する必要があるため、はより大きいオーバーヘッドを持っています。で置き換えるrequiresことincludesは、多くの場合、優れた最適化手法です。


2
私はそれが遅いコメントであることを知っていますが、これは実際には正しくありません。requireはファイルを解析するだけですinclude_onceこれらの関数のバージョンにはそれぞれオーバーヘッドが少しありますが、他の人が言ったように、ほとんどのアプリケーションでは無視できる程度です。
ahouse101 2014年

-2

requireとincludeを使用するだけです。

include_onceまたはrequire_onceでの作業方法を考えるからです。これは、含まれている、または必要なPHPファイルを保存するログデータを探しています。したがって、それはincludeおよびrequireよりも遅くなります。

if (!defined(php)) {
    include 'php';
    define(php, 1);
}

このように使うだけ...

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