大規模な Web プロジェクトでは、include_path が モジュール性 設計の基礎となります (もちろん、自動ロードに基づいた設計も数多くありますが、これはこの記事の説明に影響しません)。しかし、まさに include_path があるためです。 、多くの場合、これにより、正しいファイルが見つからないことが原因で、一見「奇妙な」問題が発生することがあります。
次の疑問も生じます:
include_path はどのように機能しますか?
複数ある場合、その順序は何ですか? include_path?
どのような状況で include_path が機能しないのでしょうか?
今日は、例から始めてこの問題を包括的に紹介します。
以下のディレクトリ構造:
root ├ 1.php ├ 3.php └ subdir ├ 2.php └ 3.php
1.php 内:
コード
<?php ini_set("include_path", ".:path_to_subdir"); require ("2.php"); ?>
そして 2.php では:
<?php require("3.php"); ?>
そして、ルート ディレクトリの 3.php は "root" を出力し、サブディレクトリの 3.php は "root" "subdir" を出力します。
さて、ここで私の質問が来ます:
1. ルートディレクトリで 1.php を実行すると、どのような出力が得られますか?
2. サブディレクトリの下の上位ディレクトリで 1.php を実行すると、どのような出力が得られますか?
3. include_path の現在のディレクトリ パス (つまり、include_path="path_to_subdir") をキャンセルすると、PHP の
include_path の出力はどうなりますか?
PHP は require( _once)/include( _once) 命令を実行すると、最初に以下の判断が行われます: インクルードするファイルパスが絶対パスかどうか
そうであれば、直接インクルードして終了します
そうでない場合は、別のロジックを入力します (複数の呼び出しの後、マクロは展開されます) _php_stream_fopen_with_path) を入力して、このファイルを探します
次に、_php_stream_fopen_with_path で、次の判断が行われます:
含めるファイルパスは相対パス (./file, ../dir/ の形式) かどうかファイルの場合は、以下の「ディレクトリ相対パス」を使用してください)?
その場合は、include_path のロジックをスキップして、相対パスを直接解析します (後ほど個別に説明します)
は、include_path と現在の実行ファイルに基づいて作成されます。例えば、前回の記事の例の場合、次のように候補リストが作成されます
コードは次のとおりです。
".:path_to_subdir:current_script_dir
そうすると、候補リストの先頭から順に、 DEFAULT_DIR_SEPARATOR(この記事の環境は「:」) 候補リストからパスを取り出し、そのパスに含めるファイル名を追加して試し、成功した場合は戻り、そうでない場合は次の候補を続行します。
ここまでで、最初に挙げた 3 つの質問に答えることができます。 1. ルート ディレクトリで実行されるため、include_path の 2 番目の候補のパスが再生されます。 role.(path_to_subdir)、path_to_subdir/2.php が見つかり、2.php に 3.php が含まれる場合、現在の作業ディレクトリは root の下にあるため、3.php が含まれる場合、include_path が最初のパス候補になります。" "(現在の作業ディレクトリ) なので、出力は "root" になります。
2. 現在のパスが subdir であるため、出力は "subdir" になります。 2.php が 3.php にインクルードされるのは、ルート ディレクトリで実行する場合、path_to_subdir が役割を果たすため、ルートでもサブディレクトリでも、「subdir」の出力が得られます。
そして、2.php の include_path をクリアすると、
。
<?php ini_set("include_path", ''); require("3.php"); ?>
ディレクトリ相対パスの状況を説明するために、別の例を見てみましょう。ただし、1.php は次のようになります。 .php は:
<?php ini_set("include_path", "/"); require("./subdir/2.php"); ?>
以上がPHPのrequire命令とinclude命令の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。