ホームページ  >  記事  >  バックエンド開発  >  PHP の require/include シーケンスを深く理解する Recommendation_PHP チュートリアル

PHP の require/include シーケンスを深く理解する Recommendation_PHP チュートリアル

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

次のような質問もあります:

include_path はどのように機能しますか?

include_path が複数ある場合の順序はどうなりますか?

include_path はどのような状況で機能しませんか?

今日は、例から始めて、この問題について包括的に紹介します。

以下のディレクトリ構造:

<OL><LI>  root<LI>    ├ <SPAN class=sh_number>1</SPAN><SPAN class=sh_symbol>.</SPAN>php<LI>    ├ <SPAN class=sh_number>3</SPAN><SPAN class=sh_symbol>.</SPAN>php<LI>    └ subdir<LI>         ├ <SPAN class=sh_number>2</SPAN><SPAN class=sh_symbol>.</SPAN>php<LI>          └ <SPAN class=sh_number>3</SPAN><SPAN class=sh_symbol>.</SPAN>php</LI></OL>

1.php:

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

e2c4681e5941f234de3f0c354f819a4b

そして 2.php:
コードは次のとおりです:
require("3.php"); ;


ルートディレクトリの 3.php は「root」を出力し、サブディレクトリの 3.php は「subdir」を出力します。
ここで質問です:
1. ルートディレクトリで 1.php を実行すると、どのような出力が得られますか?
2. サブディレクトリの下の上位ディレクトリで 1.php を実行すると、どのような出力が得られますか? include_path の現在のディレクトリ パス (つまり、include_path="path_to_subdir") をキャンセルする場合、PHP で

include_path が require(_once)/include(_once ) 命令に遭遇すると、どのような出力になりますか?



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

含めるファイルパスは絶対パスですか? そうであれば直接含めて終了します。いいえ、別のロジックを入力してください (複数回呼び出した後、マクロ展開後に _php_stream_fopen_with_path を入力します) このファイルを見つけます 次に、_php_stream_fopen_with_path で次の判断が行われます:


コードをコピーします

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


含めるファイル パスは相対パスですか (./file、../dir/file の形式で、以下の「ディレクトリ相対パス」に置き換えられます)
そうであれば、include_path のロジックをスキップして直接指定します。相対パス Path を解析します (後で別途紹介します) は include_path と現在実行されているファイルのパスに基づいて候補ディレクトリ リストを作成します。 たとえば、前の記事の例では、次のような候補リストが作成されます

コードをコピーします

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


".:path_to_subdir:current_script_dir
次に、候補リストの先頭から、DEFAULT_DIR_SEPARATOR (この記事の環境は ":") を指定して、このパスにインクルードするファイル名を追加して試行します。インクルードに成功した場合は戻り、そうでない場合は次の候補パスに進みます。最初に挙げた 3 つの質問に答えることができます。 1. ルート ディレクトリで実行されるため、1.php に 2.php が含まれている場合、include_path の 2 番目の候補パス (path_to_subdir)、path_to_subdir/2.php が機能します。が見つかり、2.php に 3 .php が含まれている場合、現在の作業ディレクトリは root の下にあるため、3.php が含まれる場合、一致するファイルは include_path "." (現在の作業ディレクトリ) の最初の候補パスの下に見つかります。取得される出力は「root」です。 2. 現在のパスが subdir であることを除き、出力は「subdir」になります。 ルート ディレクトリで実行する場合は、現在のパスに include_path が存在しないためです。 , 2.php 3.phpをインクルードする場合、path_to_subdirが役割を果たすので、rootでもsubdirでも「subdir」の出力が得られます
そして、2.phpのinclude_pathをクリアしたら、


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


ini_set("include_path", '');
require("3.php");
すると、 current_script_dir が有効になります。今回は current_script_dir が 2.php パスなので、引き続き「subdir」の出力が得られます。 ディレクトリ相対パス
ディレクトリ相対パスを使用する場合、相対パスの基点は常に現在の作業ディレクトリになります。
ディレクトリ相対パスの下の状況をもう一度見てみましょう。これは上記と同じディレクトリ構造ですが、1.php は次のようになります:



コードをコピーします
コードは次のとおりです。
ini_set("include_path", " /"); require("./subdir/2.php")

2.php は次のようになります:
コードは次のとおりです。

require("./3.php")

;
ルートディレクトリで実行した場合、2.php内の3.phpの検索はカレントディレクトリの相対パスで検索されるため、得られる出力は「root」、サブディレクトリ下で実行した場合は上位の1 php(php -f ../1.php) は、subdir の下に "./subdir/2.php" が見つからないため、異常終了します。および相対パス 次に、パフォーマンスは検索の回数に関係します。最悪の場合、include_path が 10 個ある場合、含めるファイルを見つけるまでに最大 11 回の再試行が必要になる可能性があります。そのため、絶対パスを使用するのが最善です。絶対パスを使用します。
2. ディレクトリ相対パスの basedir を使用する場合は、実際の展開パスに関連付ける必要があるため、実際には使用されません。 chdir を使用して完了するモジュールもあります) 3. モジュラー システム設計では、通常、モジュールのデプロイメント パス (dirname(__FILE__)、php5.3 以降で提供される) を取得して、モジュール内の絶対パスを使用する必要があります。 __DIR__ 定数)。


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

www.bkjia.com

http://www.bkjia.com/PHPjc/322704.html技術記事次のような質問もあります: include_path はどのように機能しますか? include_path が複数ある場合、どのような順序で機能しますか? 今日は、包括的な紹介をします。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:Discuz うちょめ ajaxpost Tips_PHP チュートリアル次の記事:Discuz うちょめ ajaxpost Tips_PHP チュートリアル

関連記事

続きを見る