ホームページ >バックエンド開発 >PHPチュートリアル >include_once (require_once) はできるだけ使用しないことをお勧めします

include_once (require_once) はできるだけ使用しないことをお勧めします

黄舟
黄舟オリジナル
2017-06-25 11:54:592119ブラウズ

この記事は、(include/require)_onceを使用すべきではない理由を詳細に分析して紹介したものです。必要な友達は、includeと

include_once

のどちらを使用するかについてを参照してください(以下、すべてinclude) require_once)、この議論は非常に長く、結論は常に、つまり include_once の代わりに include を使用してみてください、というものでした。これまでの最も一般的な理由は、include_once がロードされたファイル リストを確認するためにクエリする必要があるということでした。

これは本当で、この理由は正しいですが、今日話したいのは別の理由です

ファイルがロードされているかどうかを判断するには、PHP が次のことを行う必要があることがわかっています。ファイルの open_path を取得するには、たとえば次のことを意味します:

コードをコピー コードは次のとおりです:

<?php
set_include_path
("/tmp/:/tmp2/");
include_once("2.php");
?>


PHP が include_once "2.php" を認識した場合、実際のパスが何かはわかりません。このファイルはあり、ロードされたファイルのリストから移動することはできません。ロードされているかどうかを判断するため、include_once の実装では、最初にファイルの実際のパスを解析しようとします (通常のファイルの場合、この解析はチェックと同じです) getcwd とファイル パス。相対パスの場合、通常は成功しません)。解析が成功した場合は、EG (include_files) を検索します。存在する場合は、それが含まれていることを意味し、そうでない場合は返します。ファイルを開いてファイルのopened_pa​​thを取得します。たとえば、上記の例では、このファイルは「/tmp2/2.php」に存在します

その後、open_pathを取得した後、PHPはロードされたファイルのリストに移動して検索します。含まれていない場合は、ファイルを開く必要はありません。

1. 正常に解析できた場合は、ファイル パスの絶対値を解析してみます。 EG (include_files) を確認し、存在する場合は戻り、存在しない場合は続行します
2. ファイルを開き、ファイルのオープンパス (opened path) を取得します
3. オープンされたパスを取得し、EG (include_files) を検索します。 、存在するかどうか、存在する場合は戻り、存在しない場合は続行します
4. ファイルをコンパイルする (compile_file)

ほとんどの場合、これは問題ありませんが、問題は APC を使用する場合にあります...

ときAPC を使用すると、APC はコンパイル済みファイルへのcompile_file ポインターをハイジャックし、それによってコンパイル結果をキャッシュから直接取得し、実際のファイルを開いたり、オープンするためのシステムコールを回避したりできます。

ただし、コード内で include_once を使用する場合は、compile_file の前に、 , PHP はすでにファイルを開こうとしていますが、APC によってハイジャックされたコンパイル ファイルを入力すると、この問題を解決するために、APC は include_once_override を導入し、PHP の ZEND_INCLUDE_OR_EVAL をハイジャックします。 opcodeハンドラーを呼び出し、statを通じてファイルの絶対パスを決定します。その後、それがロードされていないことが判明した場合は、opcodeを書き換えてインクルードし、トリッキーな解決策を作成します。

しかし、それは残念です。 APC の include_once_override が適切に実装されておらず、次のような未定義の問題が発生する可能性があると言われています。

コードをコピーします コードは次のとおりです:

<?php
set_include_path("/tmp");
function a($arg = array()) {
    include_once("b.php");
}
a();
a();
?>


そして、私たちの b.php は " に配置されます。 /tmp/ b.php"、内容は次のとおりです:

コードは次のとおりです:

<?php
  class B {}
?>


次に、apc.include_once_override がオンになっている場合、継続的にアクセスすると次のエラーが発生します:

致命的なエラー - include () : クラス b を再宣言できません

これらの技術的要因を除けば、私は常に include_once の代わりに include を使用すべきであると信じてきました。なぜなら、自分で完全に計画でき、ファイルは 1 回だけロードされるからです。 自動ロードも使用できます。 これを行うには

include_once を使用する場合、それはコードに自信がないことを証明するだけです。

したがって、もう include_once を使用しないことをお勧めします。

以上がinclude_once (require_once) はできるだけ使用しないことをお勧めしますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。