PHPのincludeとrequireを徹底的に理解しましょう!

藏色散人
リリース: 2023-04-09 18:18:02
転載
3361 人が閲覧しました

PHP では、外部ファイルをインクルードする方法が 2 つあります。つまり、include と require です。それらの違いは何ですか?

ファイルが存在しない場合、またはエラーが発生した場合、require は E_COMPILE_ERROR レベルのエラーを生成し、プログラムの実行が停止します。インクルードは警告のみを生成し、スクリプトは実行を続行します。

これがそれらの主な違いであり、他の点では、require は基本的に include と同じです。

  • インクルードされたファイルは、最初にパラメータで指定されたパスに従って検索され、ディレクトリが指定されていない場合 (ファイル名のみ)、include_path で指定されたディレクトリに従って検索されます。ファイルが include_path の下に見つからない場合、include は最終的に、呼び出し元のスクリプト ファイルが配置されているディレクトリと現在の作業ディレクトリを検索します。
  • include_path は php.ini で定義されています
  • ファイルがインクルードされると、それに含まれるコードは次の行の変数スコープを継承します。インクルードが見つかりました。その時点から、呼び出し側ファイルのその行で使用可能な変数は、呼び出されたファイルでも使用できるようになります。ただし、インクルード ファイルで定義されたすべての関数とクラスはグローバル スコープを持ちます。
  • #通常の require と include に加えて、require_once と include_once もあります。それらの関数は次のとおりです:

ファイルが既にインクルードされている場合、再度インクルードされることはありません。このステートメントの名前が示すように、スクリプトの実行中に同じファイルが複数回インクルードされる可能性があり、それを避けるために必ず 1 回だけインクルードする必要がある場合に、only include Once

    を使用できます。関数の再定義、変数の再割り当て、その他の問題
  • いくつかの例を見てみましょう:
// a.php 不存在
include "a.php"; // warning
// require "a.php"; // error

echo 111; // 使用include时111会输出

// file1.php 中只有一行代码echo 'file1';
require_once 'includeandrequire/file1.php'; // file1
require_once 'includeandrequire/file1.php'; // noting

include_once 'includeandrequire/file1.php'; // noting
include_once 'includeandrequire/file1.php'; // noting

require 'includeandrequire/file1.php'; // file1
require 'includeandrequire/file1.php'; // file1

require 'includeandrequire/file1.php'; // file1
require 'includeandrequire/file1.php'; // file1
ログイン後にコピー
最初の _once が、require_once であっても include_once であっても、正常に読み込まれると、このファイルは再度ロードされません。 _once を指定しないと、ファイルは繰り返しロードされます。

file2.php

<?php

echo 'file2:' . $a, PHP_EOL;
echo 'file2:' . $b, PHP_EOL;
$b = "file2";

myFile.php

<?php

$a = 'myFile';
$b = 'youFile';
require_once 'includeandrequire/file2.php';
echo $a, PHP_EOL;
echo $b, PHP_EOL;

// 输出结果
// file2:myFile
// file2:youFile
// myFile
// file2

file3.php
<?php

$c = 'file3';

myFile.php
<?php
function test(){
    require_once 'includeandrequire/file3.php';
    echo $c, PHP_EOL; // file3
}
test();
echo $c, PHP_EOL; // empty
ログイン後にコピー
インクルードされたファイルは親ファイルの変数を取得でき、親ファイルもインクルードされたファイルの変数を取得できますが、_once の特殊なケースに注意する必要があります。

function foo(){
    require_once 'includeandrequire/file3.php';
    return $c;
}

for($a=1;$a<=5;$a++){
    echo foo(), PHP_EOL;
}

// file3
// empty
// empty
// empty
// empty
ログイン後にコピー
_once を使用してループで読み込むと、最初は file3.php の内容のみが出力されます。これはなぜですか?現在の変数のスコープはメソッド内にあるため、最初のロードが完了すると、後続のファイルは再度ロードされません。このとき、次の 4 つのループでは $c は定義されておらず、$c のデフォルトは null 値になります。

2 つのメソッドで _once を使用してファイルが同時にロードされた場合、2 番目のメソッドでもそのファイルがロードされますか?

function test1(){
    require_once 'includeandrequire/file1.php';
}
function test2(){
    require_once 'includeandrequire/file1.php';
}
test1(); // file1
test2(); // empty
ログイン後にコピー
申し訳ありませんが、最初のメソッドのみが正常にロードされ、2 番目のメソッドは再度ロードされません。

それでは、日常の開発で使用するのにどちらが適しているのでしょうか?

効率の面では、_once はファイルがロードされているかどうかを確認する必要があります。効率は低くなりますが、絶対的なものではありません。肉眼では見えない場合もあるため、その効率は低くなります。問題は無視して構いません。そして、_once を使用しない場合よりもはるかに多くのメリットをもたらします。

    事前エラーの原則に基づいて、require_once を使用する方が良いでしょう。警告を表示しないように PHP エラー レベルを調整すると、 include の警告情報が表示されなくなり、予期しないエラーが発生するためです。このファイルは複数のクラスまたはメソッドで使用する必要があります。_once を使用すると、同じファイルを後続のメソッドでロードできなくなる可能性があります。
  • require または include を使用する場合は、括弧を使用しないことをお勧めします。 include ('xxx.php'); などを使用します。これらはシステム メソッドではなく式キーワードであるため、 include 'xxx.php'
  • include および require ファイルを直接使用できます。 return が存在する場合は、変数を使用して returnun によって返されたデータを受け取ることができます。さらに、次のように、PHP 以外のファイルやリモート ファイルをロードすることもできます (リモート ロードでは、php.ini のallow_url_include が On であることを確認する必要があります)。 ##
    file4.php
    <?php
    
    return 'file4';
    
    file4.txt
    可以吧
    
    myFile.php
    <?php
    $v = require 'includeandrequire/file4.php';
    echo $v, PHP_EOL; // file4
    
    include 'includeandrequire/file4.txt';
    // 可以吧
    
    include 'https://www.baidu.com/index.html';
    // 百度首页的html代码
    ログイン後にコピー
  • これで、 include と require についての理解が非常に深まりました。ファイルをロードするこれら 2 つの方法は複雑ではありませんが、いくつかの落とし穴にもなりがちです。特に _once がメソッドで使用されている場合は、特別な注意が必要です。それに対して支払わなければなりません。最後に、ちょっとしたおまけとして、ディレクトリ内のすべてのファイルを一度にロードするメソッドをカプセル化します。

以上がPHPのincludeとrequireを徹底的に理解しましょう!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:segmentfault.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!