PHPの場合:
requirevsはいつ使用すべきincludeですか?require_oncevsはいつ使用すべきinclude_onceですか?
PHPの場合:
requirevsはいつ使用すべきincludeですか?require_oncevsはいつ使用すべきinclude_onceですか?回答:
あるrequireとinclude_once同様。
だからあなたの質問は...
requirevsはいつ使用すべきincludeですか?require_once対requirerequire()関数はinclude()と同じですが、エラーの処理方法が異なります。エラーが発生した場合、include()関数は警告を生成しますが、スクリプトは実行を継続します。require()は致命的なエラーを生成し、スクリプトは停止します。
2の答えはここにあります。
require_once()ステートメントはrequire()と同じですが、PHPはファイルがすでにインクルードされているかどうかをチェックし、インクルードされている場合は再度インクルード(require)しません。
require_once()、2つのうちの方が速くなります
使用する
必要とする
ファイルがされたときに必要な、重要なメッセージテンプレートやアプリが壊れることになることなく、設定変数を含むファイルを、たとえば、アプリケーションで。
ファイルに後続のインクルードでエラーが発生するコンテンツが含まれている場合はrequire_once。たとえば
function important() { /* important code */}、アプリケーションで間違いなく必要ですが、関数を再宣言できないため、再度インクルードしないでください。
含める
たファイルは必要ありませんし、見つからない場合はアプリケーションフローは、例えば継続すべき時に
現在のスコープか何かから変数を参照するテンプレートの偉大を
include_once
オプションの依存関係。後続のロードでエラーが発生するか、HTTPオーバーヘッドのために2回発生させたくないリモートファイルのインクルード
しかし、基本的には、どれをいつ使用するかはあなた次第です。
include?include_once?require?require_once?
私の提案はrequire_once、時間の99.9%を使用することです。
を使用するrequireか、include代わりに、コードが他の場所で再利用できないこと、つまり、実際に取り込んでいるスクリプト、実行することの代わりにコードを利用可能 Aクラスまたはいくつかの関数ライブラリを。
その場で実行するコードを必要とする/含める場合、それは手続き型コードであり、新しいパラダイムを知る必要があります。オブジェクト指向プログラミング、関数ベースのプログラミング、または関数型プログラミングのように。
既にオブジェクト指向プログラミングまたは関数型プログラミングを行っている場合、スタックのどこでバグ/エラーを見つけるかを使用するinclude_onceと、ほとんどの場合遅延します。do_cool_stuff()後でそれを呼び出すときに関数が使用できないこと、またはライブラリを要求することによって関数が使用可能であると予想される瞬間に、関数が使用できないことを知りたいですか?一般に、必要なものや期待するものが利用できない場合は、すぐに知るのが最善です。require_once。
または、最新のOOPでは、使用時にクラスをオートロードするだけです。
include(それが存在しないのいずれかの可能性を持っているファイルを含むことはかなり稀だから)、およびそのうちの家族は、通常は完全に悪い考えているrequire_onceとrequire、あなたが使用する必要があるrequire_onceファイルを含めたときに定義する関数やクラスを他の場所で使用requireしたり、データベース接続オブジェクトのようなシングルトンをインスタンス化したり、インクルードされるとすぐに処理を行うファイルをインクルードするために使用します。大規模なWebアプリケーションでは、後者のインクルードは珍しいものです。
require_onceほぼ常に使用される可能性が最も高い候補であることに同意します。選択肢間のオーバーヘッドのわずかな違いを考えると、requireスクリプトが確実に停止するため、ファイルが含まれていなくてもアプリケーションが存続できる多くのシナリオは考えられません。そして_once、重複の問題から保護します。同意しない人は、自分が何をしているのかを知っている可能性が高いため、アプリケーションまたはシナリオに適したものを選択できます。
include() ファイルを含めることができない場合は警告がスローされますが、スクリプトの残りの部分は実行されます。
require()E_COMPILE_ERRORファイルを含めることができない場合は、スクリプトをスローして停止します。
include_once()そしてrequire_once()それがすでに含まれている場合の関数は二度目のファイルが含まれていません。
次のドキュメントページを参照してください。
あなたが使用しているときはいつでも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回だけ含まれますが、それ以降の実行は停止します。
クラスと関数の定義はファイルに整理しておく必要があります。
依存関係(クラス、関数、定数)require_once()を読み込むために使用します。
テンプレートのようなファイルrequire()をロードするために使用します。
オプションの依存関係(クラス、関数、定数)include_once()をロードするために使用します。
オプションのテンプレートのようなファイルinclude()をロードするために使用します。
この質問は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実際には。
include()出力バッファにラップされたを使用して、テンプレートエンジンを実装します。
require()大きなファイルを分割するために使用する人はほとんどいません。
require_once関数内でPHPMailer を使用するときに同じ問題に直面し、オートローダー$mailがコードで後で必要な変数を定義しているため、次の変数require_onceは無視され、$mail初期化されていません!解決策はrequire、関数呼び出しの後に単に使用することでした。
requireそのような場合に使用しない理由はありますか?
違いは、コマンドが生成するエラーです。ではrequire、使用したいファイルが本当に必要なので、E_ERROR見つからない場合はを生成します。
require()include()失敗時以外はと同じですが、致命的なE_ERRORレベルのエラーも生成します。
include のみを生成します E_WARNING失敗した場合にエラーがます。
したがって、残りのコードを機能させるためにファイルが必要であり、スクリプトがファイルを失敗させるようにしたい場合は、これを使用できません。
の場合*_once():
include_once()スクリプトの特定の実行中に同じファイルが含まれ、評価される可能性がある場合に使用できます。この場合、関数の再定義、変数値の再割り当てなどの問題を回避するのに役立ちます。
require_once()もちろん同じことが当てはまります。
リファレンス:require()、include_once()
requireE_ERRORではなく、E_COMPILE_ERRORを返します。
私は次のように関数を使用していました:
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ます。
マニュアルから:
require()include()失敗時以外はと同じですが、致命的なE_COMPILE_ERRORレベルのエラーも生成します。つまり、スクリプトを停止しますが、スクリプトの続行を許可include()する警告(E_WARNING)のみを発行します。
同じことが_once()バリアントにも当てはまります。
とき1を使うべきrequireかinclude?
requireそしてinclude機能同じタスクを行う、つまりは含まれており、指定されたファイルを評価し、その差がrequire指定したファイルの場所が無効またはに対し、任意のエラーのためにあるときに致命的なエラーが発生しますinclude警告を生成し、コードの実行を継続します。
したがってrequire、含めようとしているファイルがシステムの中心であり、残りのコードに大きな影響を与える可能性がある場合に関数を使用できます。include関数インクルードしようとしているファイルが重要度の低いコードを含む単純なファイル。
私の個人的な推奨事項(それほど重要ではないコード)はrequire、コードをデバッグし、後ですべてのrequire関数をinclude関数に置き換えてからプロダクションに移動してから失敗した場合に備えて、コードのあらゆる場所で関数にアクセスすることですエンドユーザーに影響を与えず、残りのコードが適切に実行されるバグ...
いつ使用すべきrequire_onceかrequire?
requireとrequire_onceis の基本的な違いはrequire_once、ファイルが既に含まれているかどうかをチェックします。既に含まれている場合、ファイルは含まれませんが、require関数はファイルが既に含まれているかどうかに関係なくファイルを含めます。
したがって、コードの一部を繰り返しrequire含めたい場合は関数を繰り返し使用しますが、コードにコードを1回だけ含めたい場合はを使用しますrequire_once。
これらはすべて、ファイルを含める方法です。
必要とは、それが必要であることを意味します。Require_onceは、それが必要になることを意味しますが、必要なのは1回だけです。含めるとは、ファイルを含めますが、続行する必要がないことを意味します。
例:
Require 'filename'
Require_once 'filename'
Include 'filename'
ファイルを1回だけインクルードするinclude_once関数もあります。
Include_once 'filename'
携帯電話から入力しているときは、大文字を使用しないでください。
気付いたのは、インクルードを使用すると、インクルードされたファイルの関数からのみ、インクルードされたファイルにアクセスできることです。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();
}
多くの場合、クライアントライブラリを条件付きでロードするか、それとも使用するかどうかに関係なくロードするかが問題になります。
具体的な例を次に示します。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();
}
}
?>
特定の状況でのみ使用される可能性があり、使用されていないときにそれをロードしたくないクラスをロードするオーバーヘッドに関心がない場合を除きます。
requireinclude最初にファイルを解析する必要があるため、はより大きいオーバーヘッドを持っています。で置き換えるrequiresことincludesは、多くの場合、優れた最適化手法です。
requireはファイルを解析するだけですinclude。_onceこれらの関数のバージョンにはそれぞれオーバーヘッドが少しありますが、他の人が言ったように、ほとんどのアプリケーションでは無視できる程度です。
requireとincludeを使用するだけです。
include_onceまたはrequire_onceでの作業方法を考えるからです。これは、含まれている、または必要なPHPファイルを保存するログデータを探しています。したがって、それはincludeおよびrequireよりも遅くなります。
if (!defined(php)) {
include 'php';
define(php, 1);
}
このように使うだけ...