Summary of require and include path issues in PHP
Relative paths refer to paths starting with ., such as
<code>./a/a.php (相对当前目录) ../common.inc.php (相对上级目录),</code>
Absolute path is a path starting with / or a similar drive letter like C:/ under Windows. The full path can uniquely determine the final address of the file without any参照パス。 例如
<code>/apache/wwwroot/site/a/a.phpc:/wwwroot/site/a/a.php</code>
凡是不以 . 或者 / 开头、也不是windows下 盘符:/ 开头的路径,例如
<code>a/a.php common.inc.php,</code>
开始以为这也是相对路径,但在php的include/require包含机制中,这种类型的路径跟以 . 开头的相对路径处理是完全不同的。 less './a.php'を要求し、「a.php」が異なります!
Let's analyze the processing methods of these three types of include paths: First, remember a conclusion: if the include path is a relative path or an absolute path, it will not go to include_path (include_path defined php.ini 環境変数で指定するか、プログラムで set_include_path(...) を使用してファイルを見つけます。
Note: The following discussion and conclusion are based on this environment: Assumption A=http://www.xxx.com/app/test/ a.php では、以下の説明は A への直接アクセスの場合であることを再度強調します。
インクルード解決では、相対パスには 参照ディレクトリ が必要です。 🎜> 含まれるネストレベルの数に関係なく、この参照ディレクトリは、プログラム実行エントリファイルが配置されているディレクトリ です。
Example 1<code>A中定义 require './b/b.php'; // 则B=[SITE]/app/test/b/b.phpB中定义 require './c.php'; // 则C=[SITE]/app/test/c.php 不是[SITE]/app/test/b/c.php</code>Example 2
<code>A中定义 require './b/b.php'; // 则B=[SITE]/app/test/b/b.php B中定义 require '../c.php'; // 则C=[SITE]/app/c.php 不是 [SITE]/app/test/c.php </code>Example 3
<code>A中定义 require '../b.php'; //则B=[SITE]/app/b.php B中定义 require '../c.php'; //则C=[SITE]/app/c.php 不是 [SITE]/c.php </code>Example 4:
<code>A中定义 require '../b.php'; // 则B=[SITE]/app/b.php B中定义 require './c/c.php'; / /则C=[SITE]/app/test/c/c.php 不是 [SITE]/app/c/c.php </code>Example 5
<code>A中定义 require '../inc/b.php'; // 则B=[SITE]/app/inc/b.php B中定义 require './c/c.php'; // 则C还是=[SITE]/app/test/c/c.php 不是 [SITE]/app/inc/c/c.php </code>Example 6
<code>A中定义 require '../inc/b.php'; // 则B=[SITE]/app/inc/b.php B中定义 require './c.php'; // 则C=[SITE]/app/test/c.php 不是 [SITE]/app/inc/c.php </code>3. Absolute pathThe absolute path is relatively simple and not easy to cause confusion and errors. require|インクルードは、ディスク上の対応する1つのファイルです。
<code>require '/wwwroot/xxx.com/app/test/b.php'; // Linux中require 'c:/wwwroot/xxx.com/app/test/b.php'; // windows中</code>dirname(__FILE__) is also calculated as a directory in the form of an absolute path, but please note that __FILE
__ is a Magic constants. No matter when, it is equivalent to writing this The absolute path of the PHP file where the statement is located, so dirname(__FILE__) always points to the absolute path of the PHP file where the statement is written. It has nothing to do with whether this file is included and他のファイルによって使用されます。
例1<code>A中定义 require '../b.php'; // 则B=[SITE]/app/b.phpB中定义 require dirname(__FILE__).'/c.php'; // 则B=[SITE]/app/c.php</code>例2
<code>A中定义 require '../inc/b.php'; // 则B=[SITE]/app/inc/b.phpB中定义 require dirname(__FILE__).'/c.php'; // 则B=[SITE]/app/inc/c.php 始终跟B在同一个目录</code>
結論:bがaに含まれて使用されるか、直接アクセスできるか
<code>B如果 require dirname(__FILE__).'/c.php'; // 则始终引用到跟B在同一个目录中的 c.php文件; B如果 require dirname(__FILE__).'/../c.php'; // 则始终引用到B文件所在目录的父目录中的 c.php文件; B如果 require dirname(__FILE__).'/c/c.php'; // 则始终引用到B文件所在目录的c子目录中的 c.php文件;</code>4. 未決定のパス まず、include_path で定義されたインクルード ディレクトリを使用して [未決定のパス] を 1 つずつ結合します。見つからない場合は、インクルードは正常に終了します。 executes the require statement. The directory where the file is located is used to concatenate the full path composed of [undetermined path] to find the file. If the file exists, the include file exits successfully, otherwise it means that the included file does not存在するとエラーが発生します。 未定のパスは混乱しやすく、推奨されません。 5. SolutionSince the "reference directory" in the "relative path" of
is the directory where the execution entry file is located , "undetermined" Paths are also easy to confuse, so the best solution is to use "absolute path" ; For example, the content of b.php is as follows, no matter where require b.php is based on the path of b.php Come to require c.php's
<code>$dir = dirname(__FILE__);require($dir . '../c.php');</code>or define a general function import.php, set it to "automatically import files in advance", and make the following configuration in php .ini
<code>更改配置项(必须)auto_prepend_file = "C:\xampp\htdocs\auto_prepend_file.php"更改配置项(可选)allow_url_include = On</code>import.php の内容は次のとおりです
<code>function import($path) { $old_dir = getcwd(); // 保存原“参照目录” chdir(dirname(__FILE__)); // 将“参照目录”更改为当前脚本的绝对路径 require_once($path); chdir($old_dir); // 改回原“参照目录”}</code>このように、import() 関数を使用してファイルの数に関係なく要求できます。 levels of "reference directories" it contains, it is the current fileReference article: PHP Experience summary on require and include path issues