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>
<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>
<code>A中定义 require '../b.php'; //则B=[SITE]/app/b.php B中定义 require '../c.php'; //则C=[SITE]/app/c.php 不是 [SITE]/c.php </code>
<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>
<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>
<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>
<code>require '/wwwroot/xxx.com/app/test/b.php'; // Linux中require 'c:/wwwroot/xxx.com/app/test/b.php'; // windows中</code>
__ 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>
<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>
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>
<code>更改配置项(必须)auto_prepend_file = "C:\xampp\htdocs\auto_prepend_file.php"更改配置项(可选)allow_url_include = On</code>
<code>function import($path) { $old_dir = getcwd(); // 保存原“参照目录” chdir(dirname(__FILE__)); // 将“参照目录”更改为当前脚本的绝对路径 require_once($path); chdir($old_dir); // 改回原“参照目录”}</code>