问题
So, examining this directory structure
- /include_one.php
- /include_two.php
- /directory/main_file.php
Assume that I am in /directory/main_file.php and I call include('../include_one.php');
inside of include_one.php, to include include_two.php. Do I need to call include('include_two.php);
or include('../include_two.php');
?
So my question is: When including a file, is the 'relative include path' shifted to the included file, or does it remain at the main including file?
I am aware that the best alternative would be to have a config.php which contains the root_path, however this is not possible at this stage.
update:
So, im not sure who is right, as here is my test
directory structure
/include.php
/start/start.php
/folder1/includeone.php
/folder1/folder2/includetwo.php
and here is the contents of each file
start.php
<?php
echo 'including ../include.php<br />';
include('../include.php');
?>
include.php
<?php
echo 'including folder1/includeone.php<br />';
include('folder1/includeone.php');
?>
includeone.php
<?php
echo 'including folder2/includetwo.php<br />';
include('folder2/includetwo.php');
?>
includetwo.php
<?php
echo 'done<br />';
?>
and the output is
including ../include.php
including folder1/includeone.php
including folder2/includetwo.php
done
回答1:
The "relative include path" is not shifted to the included file... Which means that using relative paths generally ends badly.
A better solution, that I use almost all the time, is to always work with absolute paths -- and you can mix relatives and absolute paths using __DIR__
, to get the directory that contains the file where this is written.
For example, in include_one.php
, you'd use :
require_once __DIR__ . '/include_two.php';
To include the include_two.php
file that's in the same directory as include_one.php
.
And, in main_file.php
, you'd use :
require_once __DIR__ . '/../include_one.php';
To include the include_one.php
file that's one directory up.
With that, your includes will work, no matter from which file they are called.
回答2:
I am using this code:
if(!isset($TO_HOME_DIR)) $TO_HOME_DIR="../";
And I include a file:
include_once($TO_HOME_DIR."common/include_one.php");
With if(!isset($TO_HOME_DIR))
, it's not important how much you include a file into included file into included file into includ..... Only first file's -and main file's- $TO_HOME_DIR declaration is used.
Second advantage of this approach is, if you change directory of file, you only need to change one line of code; $TO_HOME_DIR declaration. :)
回答3:
The include path is relative to the first file in the include chain.
A good way to ensure the correct include path is to always include from the document root.
This is done like this:
include $_SERVER['DOCUMENT_ROOT'] . '/folder1/folder2/includetwo.php';
来源:https://stackoverflow.com/questions/3334046/calling-include-from-an-included-file