ホームページ  >  記事  >  バックエンド開発  >  強い宣言: (include/require)_once_PHP チュートリアルを使用しないでください

強い宣言: (include/require)_once_PHP チュートリアルを使用しないでください

WBOY
WBOYオリジナル
2016-07-21 15:08:49771ブラウズ

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

確かにこの理由は正しいのですが、今日話したいのは別の理由です

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

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

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

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

その後、opened_pa​​th を取得した後、PHP はロードされたファイルのリストにアクセスして、それが含まれているかどうかを確認し、ファイルを開く必要はなくなります。ファイルの絶対パスを解析するには、正常に解析できた場合は EG (include_files) を確認し、存在する場合は戻り、存在しない場合は続行します
2. ファイルを開き、ファイルのオープン パス (開いたパス) を取得します。 )
3. EG (include_files) への開いたパスを使用して存在するかどうかを確認し、存在する場合は戻り、存在しない場合は続行します4. ファイルをコンパイルします (compile_file)。
これはほとんどの場合問題になりませんが、APC を使用する場合に問題が発生します...

APC を使用する場合、APC はコンパイル済みファイルのポインタをハイジャックします。
ただし、コード内で include_once を使用すると、PHP は、compile_file の前にすでにファイルを開こうとしているため、APC によってハイジャックされたコンパイル ファイルが入力され、APC はこれを解決するために include_once_override を導入します。この問題は、include_once_override がオンになっている場合、APC は PHP の ZEND_INCLUDE_OR_EVAL オペコード ハンドラーをハイジャックし、stat を通じてファイルの絶対パスを決定し、ファイルがロードされていないことが判明した場合は、オペコードを書き換えてインクルードします。難しい解決策

しかし、残念ながら、先ほども言ったように、APC の include_once_override は十分に実装されておらず、次のような未定義の問題がいくつか発生するでしょう:

コードをコピーしてください

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

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


次に、 b.php を「/tmp/b.php」に配置します。内容は次のとおりです:



コードをコピーします

コードは次のとおりです:
class B { }?>
次に、 apc.include_once_override がオンになっている場合、継続的にアクセスすると次のエラーが発生します:

致命的なエラー - include() : Cannot redeclare class b

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

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

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

http://www.bkjia.com/PHPjc/327410.html

www.bkjia.com

tru​​e

技術記事 include と include_once (以下、すべて include require_once) のどちらを使用するかについては長い議論があり、その結論は常に include_once の代わりに include を使用する方が良いというものでした。これまで最も一般的な理由は...です。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。