PHP require/include sequence explanation

Source: Internet
Author: User

Php tutorial require/include sequence explanation

In a large web project, include_path is the root of a modular design (of course, there are also many designs based on autoload, which does not affect the discussion in this article ), however, it is precisely because of include_path that we often encounter seemingly "weird" problems caused by the failure to find the correct file. then we have the following question: How does include_path work? What if there are multiple sequence de_path statements? Under what circumstances does include_path not work? Today, I will give a comprehensive introduction to this issue. Let's start with an example. The following directory structure: root 1.php 3.php subdir 2.php 3. php in 1. php:
Copy the Code as follows:
<? Php
Ini_set ("include_path", ".: path_to_subdir ");
Require ("2.php ");
?> In 2.php:
Copy the Code as follows:
<? Php
Require ("3.php ");
?> 3. php In the root directory prints "root" and 3. php In the subdir directory prints "subdir". Now, my problem is:
1. What output will I get when I run 1.php in the root directory?
2. Run 1.php in the upper-level directory under subdir. What output will it get?
3. When you cancel the current directory path (also called include_path = "path_to_subdir") in include_path, what are the output of the above two questions?
Include_path in php
When php encounters the require (_ once)/include (_ once) command, it first makes the following judgment:
Copy the Code as follows:
Is the file path to be included an absolute path?
If yes, It is included directly and ended.
If not, go to another logic (after multiple calls, expand the macro and enter _ php_stream_fopen_with_path) to search for this file. Then, in _ php_stream_fopen_with_path, the following judgment will be made:
Copy the Code as follows:
Is the file path to be included a relative path (such as./file,./dir/file, which is replaced by "directory relative path ")?
If yes, skip the role logic of include_path and directly parse the relative path (described separately later) to form a list of directories to be selected based on include_path and the path of the current execution file, for example, for the example above in the article, an optional list will be formed as follows:
Copy the Code as follows:
".: Path_to_subdir: current_script_dir then, start from the header of the list to be selected in sequence, and retrieve a path from the list to be selected according to default_dir_separator (the environment in this article is, then, append the file name to be included to the end of the path and try again. if it is successfully included, return; otherwise, continue to the next path to be selected.
So far, we have been able to answer the three questions I raised at the beginning.
1. because it is executed in the root directory. php contains 2. in php, the second path to be selected in include_path acts (path_to_subdir) and finds path_to_subdir/2.php, while in 2. php contains 3. in php, the current working directory is root, so it contains 3. in php, the first waiting path of include_path ". "(the current working directory), the matched file is found, so the output is" root ".
2. Same as 1, but the current path is subdir, so the output is "subdir ".
3. because the current path is include_path, 2. php contains 3. in php, It is path_to_subdir, so both root and subdir will get the "subdir" output.
If you clear include_path in 2.php,
Copy the Code as follows:
<? Php
Ini_set ("include_path ",'');
Require ("3.php ");
?> It will be current_script_dir, and at this time current_script_dir is the path of 2. php, so we will still get the output of "subdir.
Directory relative path
When the relative directory path is used, the base point of the relative path is always the current working directory.
To illustrate the relative directory path, let's look at a column, or the directory structure above, but 1. php is changed:
Copy the Code as follows:
<? Php
Ini_set ("include_path ","/");
Require ("./subdir/2.php ");
?> 2. php becomes:
Copy the Code as follows:
<? Php
Require ("./3.php ");
?> If the command is executed in the root directory, 2. search in php 3. php will be searched in the relative path of the current directory, so the output is "root". If it is under subdir, execute 1.php (php-f .. /1.php), because it cannot be found under subdir ". /subdir/2. php "and exit unexpectedly.
Postscript
1. because when using include_path and relative path, the performance will be related to the number of searches. In the worst case, if you have 10 include_path, you may try again for up to 11 times to find the file to be included. Therefore, it is best to use the absolute path when an absolute path is available.
2. because the basedir of the relative directory path is always the current working path, if you want to use it, it must be related to the actual deployment path, so it is rarely used (of course, the chdir module is also used ).
3. in modular system design, the module deployment path (dirname (_ file __), php5.3 and later provide _ dir _ constants) to use absolute paths.

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.