Relative paths refer to paths starting with ., such as
<code>./a/a.php (相对当前目录) ../common.inc.php (相对上级目录), </code>
The absolute path is a path starting with / or a drive letter similar to C:/ under Windows. The full path can uniquely determine the final address of the file without any reference path. For example
<code>/apache/wwwroot/site/a/a.php c:/wwwroot/site/a/a.php</code>
Any path that does not start with . or /, nor does it start with drive letter:/ under Windows, such as
<code>a/a.php common.inc.php, </code>
At first I thought this was also a relative path, but in PHP’s include/require mechanism, this type of path is handled completely differently from relative paths starting with . require './a.php' and require 'a.php' are different!
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 (the include_path environment variable defined in php.ini, or in the program Use set_include_path(...) to find the file.
Note: The following discussion and conclusion are based on this environment: Assume A=http://www.xxx.com/app/test/a.php. Again, it is emphasized that the following discussion is for direct Access to A.
A relative path requires a reference directory to determine the final path of the file. In include parsing, no matter how many levels of nesting are included, this reference directory is The directory where the program execution entry file is located.
Example 1
<code>A中定义 require './b/b.php'; // 则B=[SITE]/app/test/b/b.php B中定义 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>
Absolute paths are relatively simple and less likely to cause confusion and errors. require|inclue corresponds to files on the disk.
<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, which is equal to the location of the php file where this statement is written at any time. Absolute path, so dirname(__FILE__) always points to the absolute path of the php file where this statement is written, and has nothing to do with whether this file is included and used by other files.
Example 1
<code>A中定义 require '../b.php'; // 则B=[SITE]/app/b.php B中定义 require dirname(__FILE__).'/c.php'; // 则B=[SITE]/app/c.php </code>
Example 2
<code>A中定义 require '../inc/b.php'; // 则B=[SITE]/app/inc/b.php B中定义 require dirname(__FILE__).'/c.php'; // 则B=[SITE]/app/inc/c.php 始终跟B在同一个目录 </code>
Conclusion: No matter whether B is included and used by A, or directly accessed
<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>
First, use the include directories defined in include_path to splice [undetermined path] one by one. If an existing file is found, the include will exit successfully. If it is not found, use the directory where the php file that executes the require statement is located to splice [undetermined path] ] to search for the file. If the file exists, it will exit successfully. Otherwise, it means the file does not exist and an error will occur. Undetermined paths are easy to confuse and are not recommended.
Since the "reference directory" in "relative path" is the directory where the execution entry file is located , the "undetermined" path is also easier to confuse, so is the best The solution is to use the "absolute path" ; For example, the content of b.php is as follows. No matter where you require b.php, you will require the path of b.php as a reference to require c.php
<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>
The content of import.php is as follows
<code>function import($path) { $old_dir = getcwd(); // 保存原“参照目录” chdir(dirname(__FILE__)); // 将“参照目录”更改为当前脚本的绝对路径 require_once($path); chdir($old_dir); // 改回原“参照目录” } </code>
In this way, you can use the import() function to require the file. No matter how many levels of "reference directories" it contains, it is the current file
Reference article: Experience summary of PHP’s require and include path issues