Home > Backend Development > PHP Tutorial > Summary of require and include path issues in PHP, requireinclude_PHP tutorial

Summary of require and include path issues in PHP, requireinclude_PHP tutorial

WBOY
Release: 2016-07-13 10:11:13
Original
885 people have browsed it

Summary of require and include path issues in PHP, requireinclude

1 Absolute path, relative path and undetermined path

Relative path

Relative paths refer to paths starting with ., such as

<code>./a/a.php (相对当前目录)    
../common.inc.php (相对上级目录),
</code>
Copy after login

Absolute path

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>
Copy after login

Undetermined path

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>
Copy after login

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.

Test environment description

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.

2. Relative path:

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>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

3. Absolute path

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>
Copy after login

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>
Copy after login

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>
Copy after login

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>
Copy after login

4. Undetermined path

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.

5. Solution

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>
Copy after login

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>
Copy after login

The content of import.php is as follows

<code>function import($path) {    
    $old_dir = getcwd();        // 保存原&ldquo;参照目录&rdquo;
    chdir(dirname(__FILE__));    // 将&ldquo;参照目录&rdquo;更改为当前脚本的绝对路径
    require_once($path);
    chdir($old_dir);            // 改回原&ldquo;参照目录&rdquo;
}
</code>
Copy after login

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

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/930707.htmlTechArticleSummary of require and include path problems in PHP, requireinclude 1 absolute path, relative path and undetermined path relative path relative path Refers to the path starting with ., such as ./a/a.php (relative to...
Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template